Cod sursa(job #2028906)

Utilizator Garen456Paun Tudor Garen456 Data 28 septembrie 2017 20:17:02
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,l,T;
struct tip{int a,b;};
tip a[101],c[101];
int b[105][10500];



int vf(int t)
{ int i,j,k,maxi,mi;
   for(i=1;i<=n;++i)
    for(j=0;j<=l;++j)
    b[i][j]=-1;

    for(maxi=t/a[1].a,i=0;i<=maxi;++i)
        b[1][i]=(t-i*a[1].a)/a[1].b;

    for(i=2;i<=n;++i)
    {  mi=0;
        for(j=0;j<=l;++j)
            if(b[i-1][j]!=-1)
            for(k=0;k<=t/a[i].a && l>=k+j ;++k)
                if(k+j<=100)
                  b[i][k+j]=max(b[i][k+j],b[i-1][j]+(t-a[i].a*k)/a[i].b);

    }
   // fout<<t<<"\n";
    return (b[n][l]>=l);

}



int main()
{    int i,s,d,m,j,k;
   fin>>n>>l;
   for(i=1;i<=n;++i)
    fin>>a[i].a>>a[i].b;

   s=1; d=100;
   while(s<=d)
   { m=(s+d)/2;
       if(vf(m))
       { T=m;
           d=m-1;
       }
       else s=m+1;
   }
   fout<<T<<"\n";
   vf(T);
   //fout<<b[n][l]<<"\n";
   b[0][0]=0;
     for(i=n;i>=1;--i)
          {   // fout<<b[i][l]<<"\n";
         for(j=0;j<=T/a[i].a;++j)
           if(l-j>=0 && b[i-1][l-j]!=-1 )
            if( b[i-1][l-j]==b[i][l]-(T-a[i].a*j)/a[i].b )
         { c[i].a=j;
             c[i].b=(T-a[i].a*j)/a[i].b ;
             l=l-j;
             break;
         }

          }
for(i=1;i<=n;++i)
    fout<<c[i].a<<" "<<c[i].b<<"\n";


    return 0;
}