Pagini recente » Cod sursa (job #503502) | Cod sursa (job #2965241) | Cod sursa (job #2685127) | Cod sursa (job #716203) | Cod sursa (job #29776)
Cod sursa(job #29776)
#include <stdio.h>
int L,n;
int A[101],B[101],z[101],Z[101];
int x[101][101],y[101][101];
FILE *f;
int try (int T)
{
int i,j,max,maxi,t,tmp;
for(i=1;i<=100;i++) x[0][i]=-10000000;
for(i=1;i<=n;++i)
for(j=0;j<=L;++j)
{
max=-1000000;
maxi=0;
for(t=0;t<=j;t++)
if (t*A[i]<=T)
{
tmp=(T-t*A[i])/B[i]+x[i-1][j-t];
if (tmp>=max)
{
// printf("%d %d %d %d\n",i,j,t,tmp);
max=tmp;
maxi=t;
}
}
x[i][j]=max;
y[i][j]=maxi;
}
if (x[n][L]>=L) return 1;
return 0;
}
int main (void)
{
int i,a,b,m,j;
f=fopen("lapte.in","r");
fscanf(f,"%d %d",&n,&L);
for(i=1;i<=n;i++)
fscanf(f,"%d %d",&A[i],&B[i]);
fclose(f);
a=-1;
b=100;
do
{
m=(a+b)/2;
if (try(m))
b=m;
else
a=m;
}
while (b-a>1);
if (b==100) try(b);
f=fopen("lapte.out","w");
fprintf(f,"%d\n",b);
j=L;
for(i=n;i>=1;i--)
{
z[i]=(b-A[i]*y[i][j])/B[i];
Z[i]=y[i][j];
// fprintf(f,"%d %d %d %d\n",y[i][j],z[i],j,j-y[i][j]);
j=j-y[i][j];
}
for(i=1;i<=n;i++)
fprintf(f,"%d %d\n",Z[i],z[i]);
fclose(f);
return 0;
}