Pagini recente » Cod sursa (job #478513) | Clasament acsdfg | Clasamentul arhivei de probleme | Cod sursa (job #971604) | Cod sursa (job #1491974)
#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;
}