Cod sursa(job #179129)

Utilizator savimSerban Andrei Stan savim Data 15 aprilie 2008 18:06:21
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <stdio.h>
#define maxl 110
int i,j,k,n,l,p,q,max,sol,t,nr,x;
int a[maxl],b[maxl],d[maxl];
int c[maxl][maxl],val[maxl][maxl];
int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    
    scanf("%d %d",&n,&l);
    for (i=1; i<=n; i++)
        scanf("%d %d",&a[i],&b[i]);
    
    p=0;q=101;
    while (p+1<q)
    {
        t=(p+q)/2;
        for (i=0; i<=100; i++)
            for (j=0; j<=100; j++)
            {
                c[i][j]=0;
                val[i][j]=0;
            }

        for (j=0; j<=l; j++)
        if (a[1]*j<=t)
        {
            c[1][j]=(t-a[1]*j)/b[1];
            val[1][j]=j;
        }

        for (i=2; i<=n; i++)
            for (j=0; j<=l; j++)
            {
                max=0;nr=1;
                for (k=0; k<=j; k++)
                    if (a[i]*k<=t)
                    {
                        x=(t-a[i]*k)/b[i];

                        if (c[i-1][j-k]+x>max && c[i-1][j-k]>0)
                        {
                            max=c[i-1][j-k]+x;
                            nr=k;
                        }
                    }
                    else break;
                    
                c[i][j]=max;
                val[i][j]=nr;
            }

        if (c[n][l]>=l)
        {
           sol=t;k=l;
           for (i=n; i>=1; i--)
           {
               d[i]=val[i][k];
               k-=val[i][k];
           }
           q=t;
        }
        else p=t;
    }

    printf("%d\n",sol);
    for (i=1; i<=n; i++)
    {
        printf("%d ",d[i]);
        k=(sol-d[i]*a[i])/b[i];
        printf("%d\n",k);
    }

    return 0;
}