Cod sursa(job #827290)

Utilizator ericptsStavarache Petru Eric ericpts Data 1 decembrie 2012 22:12:14
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <cstring>
using namespace std;

int a[105];
int b[105];
int N,L;
int d[105][105];
int sola[105];
int solb[105];
int m[105][105];
inline int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
bool ok(int T)
{
    int i,j,k;
    memset(d,-1,105*105*4);
    d[0][0] = 0;
    for(i=1;i<=N;++i)
    {
        for(j=0;j<=L;++j)
        {
            for(k=0;k<= T/a[i] && k <= j;++k)
            {
                if(d[i-1][j-k] != -1)
                    d[i][j] = max(d[i][j],d[i-1][j-k] + (T-k*a[i])/b[i]);
            }
        }
    }
    return d[N][L] >= L;
}
void rebuild(int cr)
{
    memset(d,-1,105*105*4);
    d[0][0] = 0;
    int i,j,k;
    for(i=1;i<=N;++i)
    {
        for(j=0;j<=L;++j)
        {
            for(k=0;k*a[i] <= cr && k <= j;++k)
                if(d[i-1][j-k]!= -1 && d[i][j] < d[i-1][j-k] + (cr - a[i] * k)/b[i])
                {
                    d[i][j] = d[i-1][j-k] + (cr-a[i]*k)/b[i];
                    m[i][j] = k;
                }
        }
    }
    for(j=L,i=N;i>=1;--i)
    {
        sola[i] = m[i][j];
        solb[i] = (cr-m[i][j] * a[i])/b[i];
        j-=m[i][j];
    }
    for(i=1;i<=N;++i)
        printf("%d %d\n",sola[i],solb[i]);
}
int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    setvbuf(stdin,NULL,_IOFBF,1024);
    int i;
    scanf("%d%d",&N,&L);
    for(i=1;i<=N;++i)
        scanf("%d %d",a+i,b+i);
    int step = 128,cr = 105;
    for(;step;step>>=1)
        if(cr - step && ok(cr-step))
            cr-=step;
    printf("%d\n",cr);
    rebuild(cr);
    return 0;
}