Pagini recente » Cod sursa (job #1311971) | Cod sursa (job #185398) | Cod sursa (job #1392909) | Cod sursa (job #2869995) | Cod sursa (job #390402)
Cod sursa(job #390402)
#include<fstream>
using namespace std;
const char iname[]="lapte.in";
const char oname[]="lapte.out";
const int maxn=105;
ifstream f(iname);
ofstream g(oname);
int n,i,j,a[maxn],b[maxn],l,step,dp[maxn][maxn],drinka[maxn][maxn],drinkb[maxn][maxn],da,db,k;
int fda[maxn],fdb[maxn];
int net(int t)
{
int i,k;
for(i=1;i<=n;++i)
{
for(j=0;j<=l;++j)
dp[i][j]=dp[i-1][j],drinka[i][j]=0,drinkb[i][j]=0;
for(da=0;;++da)
{
if(da*a[i]>t)
break;
db=t-da*a[i];
db/=b[i];
for(k=0;;++k)
{
if(k+da>l||dp[i-1][k]==-1)
break;
if(dp[i][k+da]>=dp[i-1][k]+db)
continue;
dp[i][k+da]=dp[i-1][k]+db;
drinka[i][k+da]=da;
drinkb[i][k+da]=db;
}
if(dp[i][l]>=l)
return i;
}
}
return 0;
}
int main()
{
f>>n>>l;
for(i=1;i<=n;++i)
f>>a[i]>>b[i];
for(i=1;i<=l;++i)
dp[0][i]=-1;
for(step=1;step<maxn;step<<=1);
for(i=0;step;step>>=1)
if(i+step<maxn&&net(i+step)==0)
i+=step;
k=net(++i);
g<<i<<"\n";
for(i=k,j=l;i;--i)
{
fda[i]=drinka[i][j];
fdb[i]=drinkb[i][j];
j-=fda[i];
}
for(i=1;i<=n;++i)
g<<fda[i]<<" "<<fdb[i]<<"\n";
f.close();
g.close();
return 0;
}