Pagini recente » Cod sursa (job #2360336) | Cod sursa (job #3002791) | Cod sursa (job #913393) | Cod sursa (job #1198503) | Cod sursa (job #2606847)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int NMAX = 100;
const int LMAX = 100;
struct lapte
{
int a , b;
lapte(int ta = 0 , int tb = 0)
{
a = ta;
b = tb;
}
};
lapte v[NMAX + 5] , ans[NMAX + 5];
int d[NMAX + 5][LMAX + 5] , pr[NMAX + 5][LMAX + 5] , n , l;
int verif(int t)
{
int i , j , k;
memset(d , -1 , sizeof(d));
memset(pr , 0 , sizeof(pr));
d[0][0] = 0;
for(i = 1 ; i <= n ; i ++)
for(j = 0 ; j <= l ; j ++)
for(k = 0 ; k * v[i].a <= t ; k ++)
if(d[i - 1][j - k] != -1)
{
int b = d[i - 1][j - k] + (t - k * v[i].a) / v[i].b;
if(d[i][j] < b)
{
d[i][j] = b;
pr[i][j] = k;
}
}
if(d[n][l] >= l)
return 1;
return 0;
}
void reconstituire(int t)
{
int i , j;
for(i = n , j = l ; i >= 1 ; j = j - pr[i][j] , i --)
{
ans[i].a = pr[i][j];
ans[i].b = (t - pr[i][j] * v[i].a) / v[i].b;
}
}
int bs()
{
int st , dr , med , last;
st = 1;
dr = 100;
last = -1;
while(st <= dr)
{
med = (st + dr) / 2;
if(verif(med))
{
last = med;
reconstituire(med);
dr = med - 1;
}
else
st = med + 1;
}
return last;
}
int main()
{
freopen("lapte.in" , "r" , stdin);
freopen("lapte.out" , "w" , stdout);
int t1 , t2 , i;
scanf("%d%d" , &n , &l);
for(i = 1 ; i <= n ; i ++)
{
scanf("%d%d" , &t1 , &t2);
v[i] = lapte(t1 , t2);
}
printf("%d\n" , bs());
for(i = 1 ; i <= n ; i ++)
printf("%d %d\n" , ans[i].a , ans[i].b);
return 0;
}