Pagini recente » Cod sursa (job #2197412) | Cod sursa (job #3005257) | Cod sursa (job #1084470) | Cod sursa (job #410121) | Cod sursa (job #1141983)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define MAX 101
int N , L , sol , d[MAX][MAX] , a[MAX] , b[MAX] , c[MAX][MAX] , cant[MAX];
bool u[MAX][MAX];
int main()
{
freopen("lapte.in" , "r" , stdin );
freopen("lapte.out" , "w" , stdout );
scanf("%d%d" , &N , &L );
for(int i = 1 ; i <= N ; ++i )
scanf("%d%d" , &a[i] , &b[i]);
int ls = 1 , ld = 100 , t ;
while(ls <= ld )
{
memset(d,0,sizeof(d));
memset(u,0,sizeof(u));
memset(c,0,sizeof(c));
t = (ls+ld)/2;
for(int i = 1 ; i <= min(L,t/a[1]) ; ++i)
d[1][i] = (t-i*a[1])/b[1],u[1][i] = 1,c[1][i] = i;
for(int i = 2 ; i <= N ; ++i )
for(int j = 0 ; j <= L ; ++j )
{
d[i][j] = -1;
for(int k = 0 ; k <= j && t-k*a[i] >= 0; ++k )
if((t-a[i]*k)/b[i] + d[i-1][j-k] > d[i][j] && u[i-1][j-k])
{
d[i][j] = (t-a[i]*k)/b[i] + d[i-1][j-k];
c[i][j] = k;
}
if(d[i][j] > 0)u[i][j] = 1;
}
if(d[N][L] >= L)
{
sol = t;
ld = t-1;
int s = L;
for(int i = N ; i ; i--)
{
cant[i] = c[i][s];
s -= c[i][s];
}
}
else ls = t+1;
}
printf("%d\n" , sol );
for(int i = 1 ; i <= N ; ++i )
printf("%d %d\n" , cant[i] , (sol-cant[i]*a[i])/b[i]);
return 0;
}