Pagini recente » Rating Cristi Sandu (Cryss95) | Cod sursa (job #472056) | Cod sursa (job #222468) | Istoria paginii runda/infoexpert | Cod sursa (job #2028897)
#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<=min(maxi,100);++j)
if(b[i-1][j]!=-1)
{for(k=0;k<=t/a[i].a ;++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);
mi=max(k+j,mi);
}
if(mi>maxi)
maxi=mi;
}
}
// 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";
for(i=n;i>=1;--i)
{ // fout<<b[i][l]<<"\n";
for(j=0;j<=T/a[i].a;++j)
if(l-j>=0)
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;
}