Pagini recente » Cod sursa (job #3162797) | Cod sursa (job #645461)
Cod sursa(job #645461)
#include<stdio.h>
#define maxdim 105
FILE*f=fopen("lapte.in","r");
FILE*g=fopen("lapte.out","w");
int n,l,i,p,m,u,crtbest = 1<<30;
int a[maxdim],b[maxdim],D[maxdim][maxdim],c1[maxdim][maxdim],c2[maxdim][maxdim],sol1[maxdim],sol2[maxdim];
inline bool posibil ( int T ){
int i,j,ca,cb;
for ( i = 0 ; i <= n ; ++i ){
for ( j = 0 ; j <= l ; ++j ){
D[i][j] = -(1<<25);
}
}
D[0][0] = 0;
for ( i = 0 ; i < n ; ++i ){
for ( ca = 0 ; ca * a[i+1] <= T ; ++ca ){
cb = (T - ca * a[i+1]) / b[i+1];
for ( j = 0 ; j <= l ; ++j ){
if ( j + ca <= l ){
if ( D[i+1][j+ca] < D[i][j] + cb ){
D[i+1][j+ca] = D[i][j] + cb;
c1[i+1][j+ca] = ca; c2[i+1][j+ca] = cb;
}
}
else{
if ( D[i+1][l] < D[i][j] + cb ){
D[i+1][l] = D[i][j] + cb;
c1[i+1][l] = ca; c2[i+1][l] = cb;
}
}
}
}
}
if ( D[n][l] >= l ){
if ( T < crtbest ){
crtbest = T;
int x,y; x = n; y = l;
while ( x ){
sol1[x] = c1[x][y]; sol2[x] = c2[x][y];
y -= c1[x][y]; --x;
}
}
return 1;
}
return 0;
}
int main () {
fscanf(f,"%d %d",&n,&l);
for ( i = 1 ; i <= n ; ++i ){
fscanf(f,"%d %d",&a[i],&b[i]);
}
p = 1 ; u = 100;
while ( p <= u ){
m = (p + u) >> 1;
if ( posibil(m) ){
u = m - 1;
}
else{
p = m + 1;
}
}
fprintf(g,"%d\n",p);
for ( i = 1 ; i <= n ; ++i ){
fprintf(g,"%d %d\n",sol1[i],sol2[i]);
}
fclose(f);
fclose(g);
return 0;
}