Pagini recente » Cod sursa (job #579552) | Clasamentul arhivei de probleme | Cod sursa (job #2927590) | Cod sursa (job #1816083) | Cod sursa (job #69264)
Cod sursa(job #69264)
#include <cstdio>
#define fin "lapte.in"
#define fout "lapte.out"
#define Nmax 101
int N,L,bst[Nmax][2*Nmax],cant[Nmax][2*Nmax],t[Nmax][2*Nmax],viz[Nmax][2*Nmax];
int v[Nmax][2];
int sol[Nmax][2],st;
int go(int lim) {
int i,j,k,a,b;
for (i=0;i<=N;++i)
for (j=0;j<=2*L;++j)
bst[i][j]=t[i][j]=viz[i][j]=0;
for (i=1;i<=N;++i) {
for (j=0;j*v[i][0] <= lim;++j) {
a=j;
b=(lim-j*v[i][0])/v[i][1];
for (k=2*L;k>=0;--k)
if ( viz[i-1][k] && k+a<=2*L && bst[i-1][k]+b >= bst[i][k+a]) {
viz[i][k+a]=1;
bst[i][k+a]=bst[i-1][k]+b;
cant[i][k+a]=a; t[i][k+a]=i-1;
}
if (bst[i][a] < b || !viz[i][a]) {
bst[i][a]=b;
cant[i][a]=a; t[i][a]=0;
viz[i][a]=1;
}
}
for (j=0;j<=2*L;++j)
if ( bst[i-1][j] > bst[i][j] || ( !viz[i][j] && viz[i-1][j]) ) {
viz[i][j]=1;
bst[i][j]=bst[i-1][j]; t[i][j]=t[i-1][j];
cant[i][j]=cant[i-1][j];
}
}
for (i=2*L;i>=L;--i)
if (viz[N][i] && bst[N][i] >= L) {
st=i;
return 1;
}
return 0;
}
int main() {
int i,m,lo,hi,x;
freopen(fin,"r",stdin); freopen(fout,"w",stdout);
scanf("%d%d",&N,&L);
for (i=1;i<=N;++i)
scanf("%d%d",&v[i][0],&v[i][1]);
lo=1; hi=Nmax;
while (lo<=hi) {
m=(lo+hi)/2;
if ( !go(m) )
lo=m+1;
else
hi=m-1;
}
printf("%d\n",lo);
i=N; go(lo);
while (i>0) {
x=cant[i][st];
sol[i][0]=x;
sol[i][1]=(lo-x*v[i][0])/v[i][1];
st-=x;
i=t[i][st];
}
for (i=1;i<=N;++i)
printf("%d %d\n",sol[i][0],sol[i][1]);
return 0;
}