Pagini recente » Cod sursa (job #2594918) | Cod sursa (job #720418) | Cod sursa (job #183430) | Cod sursa (job #950482) | Cod sursa (job #596032)
Cod sursa(job #596032)
#include<stdio.h>
#define INF -6971 //e numar prim :P
#define max(a,b) (a > b ? a : b)
int N,L,A[112][112],last[112][112];
struct pozdy
{
int a,b;
} x[112];
void read()
{
int i;
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d%d",&N,&L);
for(i=1;i<=N;i++)
scanf("%d%d",&x[i].a,&x[i].b);
}
int ok(int T)
{
int i,j,k;
for(i=1;i<=N;i++)
for(j=0;j<=L;j++)
A[i][j]=INF;
for(i=0;x[1].a*i<=T;i++)
A[1][i]=(T-x[1].a*i)/x[1].b;
for(i=2;i<=N;i++)
for(j=0;j<=L;j++)
if(A[i-1][j]!=INF)
for(k=0;x[i].a*k<=T && j+k<=L;k++)
{
if(i==3)
printf("");
if(A[i-1][j]+(T-x[i].a*k)/x[i].b > A[i][j+k])
last[i][j+k]=j;
A[i][j+k]=max(A[i][j+k],A[i-1][j]+(T-x[i].a*k)/x[i].b);
}
return A[N][L]>=L;
}
void recon(int i,int j)
{
if(i==1)
{
printf("%d %d\n",j,A[i][j]);
return;
}
recon(i-1,last[i][j]);
printf("%d %d\n",j-last[i][j],A[i][j]-A[i-1][last[i][j]]);
}
void solve()
{
int st=1,dr=6971,m,lst=-1;
while(st<=dr)
{
m=(st+dr)/2;
if(ok(m))
lst=m,dr=m-1;
else
st=m+1;
}
printf("%d\n",lst);
lst=ok(lst);
recon(N,L);
}
int main()
{
read();
solve();
return 0;
}