Pagini recente » Cod sursa (job #3127956) | Cod sursa (job #891314) | Cod sursa (job #2843353) | Cod sursa (job #1787331) | Cod sursa (job #1142196)
#include<cstdio>
#include<cstring>
using namespace std;
#define MAX 105
int N , L , sol , a[MAX] , b[MAX] , d[MAX][MAX] , c[MAX][MAX] , cant[MAX] , maxx , nr;
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 = 0 , ld = 101 , T ;
while(ls +1 < ld )
{
T = (ls+ld)/2;
memset(d, 0 , sizeof(d));
memset(c,0,sizeof(c));
memset(u,0,sizeof(u));
for(int i = 0 ; i <= T/a[1] ; ++i )
{
d[1][i] = (T-a[1]*i)/b[1];
u[1][i] = 1;
c[1][i] = i;
}
for(int i = 2 ; i <= N ; ++i )
for(int j = 0 ; j <= L ; ++j )
{
maxx = -1;
nr = 0;
for(int k = 0 ; k <= j ; ++k )
if(a[i]*k <= T)
{
if(u[i-1][j-k] && (T-a[i]*k)/b[i] + d[i-1][j-k] > maxx)
{
maxx = (T-a[i]*k)/b[i] + d[i-1][j-k];
nr = k;
}
d[i][j] = maxx;
c[i][j] = nr;
if(maxx == -1)u[i][j] = 0;
else u[i][j] = 1;
}
else break;
}
if(d[N][L] >= L)
{
sol = T;
int x = L;
for(int i = N ; i ; i-- )
{
cant[i] = c[i][x];
x -= c[i][x];
}
ld = T;
}
else ls = T;
}
printf("%d\n" , sol );
for(int i = 1 ; i <= N ; ++i )
{
int x = (sol-cant[i]*a[i])/b[i];
printf("%d %d\n" , cant[i] , x);
}
return 0;
}