Pagini recente » Cod sursa (job #1205241) | Cod sursa (job #901922) | Cod sursa (job #2792909) | Cod sursa (job #1389981) | Cod sursa (job #809138)
Cod sursa(job #809138)
#include<stdio.h>
FILE*f=fopen("lapte.in","r");
FILE*g=fopen("lapte.out","w");
int n,l,m,a[105][105];
struct lapte
{
int a,b;
}v[102];
struct rucsac
{
int a,b;
}sol[103][102],sol1[103][102],sol2[103];
int main()
{
fscanf(f,"%d%d",&n,&l);
for(int i=1;i<=n;++i)
fscanf(f,"%d%d",&v[i].a,&v[i].b);
int p=1;
int u=100;
while(p<=u)
{
m=(p+u)/2;
for(int i=0;i<=n;++i)
for(int j=0;j<=l;++j)
a[i][j]=-1;
a[0][0]=0;
for(int i=1;i<=n;++i)
for(int j=0;j<=l;++j)
for(int t=0;t<=m/v[i].a&&t<=j;++t)
if(a[i-1][j-t]>=0)
{
int x=m-t*v[i].a;
int y=x/v[i].b;
if(a[i][j]<a[i-1][j-t]+y)
{
a[i][j]=a[i-1][j-t]+y;
sol[i][j].a=t;
sol[i][j].b=y;
}
}
if(a[n][l]>=l)
{
u=m-1;
for(int i=0;i<=n;++i)
for(int j=0;j<=l;++j)
sol1[i][j]=sol[i][j];
}
else
p=m+1;
}
fprintf(g,"%d\n",p);
int y=l;
for(int i=n;i;--i)
{
sol2[i].a=sol1[i][l].a;
sol2[i].b=sol1[i][l].b;
l-=sol1[i][l].a;
}
for(int i=1;i<=n;++i)
fprintf(g,"%d %d\n",sol2[i].a,sol2[i].b);
fclose(f);
fclose(g);
return 0;
}