Pagini recente » Cod sursa (job #705486) | Borderou de evaluare (job #1569509) | Cod sursa (job #740206) | Cod sursa (job #2656840) | Cod sursa (job #1607719)
#include <iostream>
#include <fstream>
#include <cstring>
#define inf 0x3f3f3f
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n,l,ta[105],tb[105];
int dp[105][105],lasta[105][105],lastb[105][105],sx[105],sy[105];
int Ans(int tot)
{ int i,j,k,val,mxa;
for(i=0;i<=n;i++)
for(j=0;j<=l;j++)
dp[i][j]=inf;
dp[0][0]=0;
for(i=1;i<=n;i++)
{ mxa=tot/ta[i];
for(j=0;j<=l;j++)
for(k=0;k<=min(j,mxa);k++)
{ val=dp[i-1][j-k]+((tot-(ta[i]*k))/tb[i]);
if (dp[i-1][j-k]!=inf)
{ if (dp[i][j]==inf)
dp[i][j]=val;
else
if (val>dp[i][j]) dp[i][j]=val;
}
}
}
if (dp[n][l]!=inf && dp[n][l]>=l)
return 1;
return 0;
}
void Solve(int tot)
{ int i,j,k,val,mxa,lit,i1,i2;
for(i=0;i<=n;i++)
for(j=0;j<=l;j++)
dp[i][j]=inf;
dp[0][0]=0;
for(i=1;i<=n;i++)
{ mxa=tot/ta[i];
for(j=0;j<=l;j++)
for(k=0;k<=min(j,mxa);k++)
{ val=dp[i-1][j-k]+((tot-(ta[i]*k))/tb[i]);
if (dp[i-1][j-k]!=inf)
{ if (dp[i][j]==inf)
{dp[i][j]=val;
lasta[i][j]=k;
lastb[i][j]=((tot-(ta[i]*k))/tb[i]);
}
else
{ if (val>dp[i][j])
{dp[i][j]=val;
lasta[i][j]=k;
lastb[i][j]=((tot-(ta[i]*k))/tb[i]);
}
}
}
}
}
i1=n; i2=l;
for(;i1>0;)
{ sx[i1]=lasta[i1][i2]; sy[i1]=lastb[i1][i2];
i2-=lasta[i1][i2]; i1--;
}
}
int Search()
{ int ok,st=1,dr=10005,mid;
while(st<=dr)
{ mid=(st+dr)/2;
ok=Ans(mid);
if (ok) dr=mid-1; else st=mid+1;
}
mid=(st+dr)/2;
if (!Ans(mid)) mid++;
return mid;
}
int main()
{ int i,sol;
f>>n>>l;
for(i=1;i<=n;i++)
f>>ta[i]>>tb[i];
//Ans(30);
sol=Search();
Solve(sol);
g<<sol<<"\n";
for(i=1;i<=n;i++)
g<<sx[i]<<" "<<sy[i]<<"\n";
return 0;
}