Pagini recente » Cod sursa (job #864410) | Cod sursa (job #433842) | Cod sursa (job #2852026) | Cod sursa (job #1014787) | Cod sursa (job #418224)
Cod sursa(job #418224)
#include <stdio.h>
#include <string.h>
#define MAXN 120
#define INF 200000000
int a[MAXN], b[MAXN];
int d[MAXN][MAXN];
int ant[MAXN][MAXN];
int i,n,st,dr,mij,sol,l;
int reza[MAXN], rezb[MAXN];
bool ok(int x)
{
int i,j,k;
memset(d,0,sizeof(d));
memset(ant,0,sizeof(ant));
for (j=0; j<=l; j++)
d[1][j] = (x - j*a[1])/b[1];
for (i=2; i<=n; i++){
for (j=0; j<=l; j++){
d[i][j] = 0;
for (k=0; k<=x/a[i] && k<=j; k++)
if (d[i][j] < d[i-1][j-k]+(x-k*a[i])/b[i]){
d[i][j] = d[i-1][j-k]+(x-k*a[i])/b[i];
ant[i][j] = k;
}
}
}
if (d[n][l] >= l)
return true;
else
return false;
}
int main()
{
freopen("lapte.in","r",stdin);
freopen("lapte.out","w",stdout);
scanf("%d %d",&n,&l);
for (i=1; i<=n; i++)
scanf("%d %d",&a[i], &b[i]);
st = 0; dr = (a[1]+b[1])*l;
while (st<dr) {
mij = (st+dr)/2;
if (ok(mij)){
sol = mij;
dr = mij-1;
}
else
st=mij+1;
}
ok(sol);
for (i=n; i>=1; i--){
reza[i] = ant[i][l];
l -= reza[i];
rezb[i] = (sol-reza[i]*a[i])/b[i];
}
printf("%d\n", sol);
for (i=1; i<=n; i++)
printf("%d %d\n",reza[i], rezb[i]);
return 0;
}