Cod sursa(job #1491974)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 26 septembrie 2015 20:09:02
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#define NMAX 105
int dyn[NMAX][NMAX],dap[NMAX][NMAX];
int n,l,res;
int milkA[NMAX], milkB[NMAX];
int st=0,dr=100;
bool posibil(int maxt)
{
    for(int i=0;i<=n;++i)
    {
        for (int j=0;j<=l;++j)
        {
            dyn[i][j]=-100000000;
            dap[i][j]=0;
        }
    }
    dyn[0][0]=0;
    for (int i=0;i<n;++i)
    {
        for (int j=0;j<=l;++j)
        {
            if (dyn[i][j]!=-100000000)
            {
                for (int btA=0;btA+j<=l;++btA)
                {
                    int min1=milkA[i + 1]*btA;
                    if(min1 > maxt) break;
                    int btB=(maxt-min1)/milkB[i + 1];
                    if(dyn[i+1][j+btA]<dyn[i][j]+btB)
                    {
                        dyn[i+1][j+btA]=dyn[i][j]+btB;
                        dap[i+1][j+btA]=j;
                    }
                }
            }
        }
    }
    return (dyn[n][l]>=l);
}
void solfind(int n, int sum)
{
    if (n==0) return ;
    int btA=sum-dap[n][sum];
    int btB=(res-btA*milkA[n])/milkB[n];
    solfind(n-1,sum-btA);
    printf("%d %d\n",btA,btB);
}
int main()
{
    freopen("lapte.in","r",stdin);
    freopen("lapte.out","w",stdout);
    scanf("%d%d",&n,&l);
    for(int i=1;i<=n;++i)scanf("%d%d",&milkA[i],&milkB[i]);
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(posibil(mij))
        {
            res=mij;
            dr=mij-1;
        }
        else st=mij+1;
    }
    printf("%d\n",res);
    posibil(res);
    solfind(n,l);
    return 0;
}