Pagini recente » Cod sursa (job #899508) | Cod sursa (job #731508) | Cod sursa (job #563624) | Cod sursa (job #1064717) | Cod sursa (job #179115)
Cod sursa(job #179115)
#include <stdio.h>
#define maxl 110
int i,j,k,n,l,p,q,max,sol,t,nr,x;
int a[maxl],b[maxl],d[maxl];
int c[maxl][maxl],val[maxl][maxl];
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d %d",&n,&l);
for (i=1; i<=n; i++)
scanf("%d %d",&a[i],&b[i]);
p=0;q=l+1;
while (p+1<q)
{
t=(p+q)/2;
for (i=0; i<=100; i++)
for (j=0; j<=100; j++)
{
c[i][j]=0;
val[i][j]=0;
}
for (j=0; j<=l; j++)
if (a[1]*j<=t)
{
c[1][j]=(t-a[1]*j)/b[1];
val[1][j]=j;
}
for (i=2; i<=n; i++)
for (j=0; j<=l/a[i]; j++)
{
max=0;nr=1;
for (k=0; k<=j; k++)
if (a[i]*k<=t)
{
x=(t-a[i]*k)/b[i];
if (c[i-1][j-k]>max)
{
max=c[i-1][j-k]+x;
nr=k;
}
}
else break;
c[i][j]=max;
val[i][j]=nr;
}
if (c[n][l]>=l)
{
sol=t;k=l;
for (i=n; i>=1; i--)
{
d[i]=val[i][k];
k-=val[i][k];
}
q=t;
}
else p=t;
}
printf("%d\n",sol);
for (i=1; i<=n; i++)
{
printf("%d ",d[i]);
k=(sol-d[i]*a[i])/b[i];
printf("%d\n",k);
}
return 0;
}