Pagini recente » Cod sursa (job #659357) | Cod sursa (job #1061135) | Cod sursa (job #2248685) | Cod sursa (job #253316) | Cod sursa (job #204144)
Cod sursa(job #204144)
#include <stdio.h>
#include <string.h>
#define NMAX 128
int din[NMAX][NMAX];
int bA[NMAX][NMAX];
int N,L;
int v[NMAX][2];
int compute(int T)
{
int i,j,k,x;
memset(din,0,sizeof(din));
memset(bA,0,sizeof(bA));
for (i=0;i<=L;i++)
din[1][i]=(T-i*v[1][0])/v[1][1];
for (i=2;i<=N;i++)
for (j=0;j<=L;j++)
for (k=0,din[i][j]=-1;k<=j;k++)
{
if (k*v[i][0]>T) break;
x=(T-k*v[i][0])/v[i][1];
if (x+din[i-1][j-k]>din[i][j])
{
din[i][j]=x+din[i-1][j-k];
bA[i][j]=k;
}
}
if (din[N][L]>=L) return 1;
return 0;
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
int i,j;
int sol[NMAX][2];
scanf("%d %d",&N,&L);
for (i=1;i<=N;i++)
scanf("%d %d",&v[i][0],&v[i][1]);
int T,stp,st,dr,mid;
// for (T=(1<<21)-1,stp=20;stp>=0;stp--)
// if ( compute(T- (1 << stp) ) ) T-=(1<<stp);
st=0;dr=1000;
while (st<dr-1)
{
mid=(st+dr)/2;
if ( compute(mid) ) dr=mid;
else st=mid;
}
if ( compute(st) ) T=st;
else T=dr;
printf("%d\n",T);
compute(T);
for (i=N,j=L;i;i--)
{
sol[i][0]=bA[i][j];
sol[i][1]=(T-bA[i][j]*v[i][0])/v[i][1];
j-=bA[i][j];
}
for (i=1;i<=N;i++)
printf("%d %d\n",sol[i][0],sol[i][1]);
return 0;
}