Pagini recente » Cod sursa (job #1643773) | Cod sursa (job #1494721) | Cod sursa (job #2504646) | Cod sursa (job #779405) | Cod sursa (job #2507257)
#include <iostream>
#include <cstdio>
using namespace std;
int n, l;
int a[105], b[105];
int path1[105], path2[105];
int d[105][105]; /// d[i][j] - nr de litri de lapte A pe care pot sa il bea primii i oameni, dupa ce au baut j litri de lapte B
int pre[105][105]; /// pre[i][j] - coloana de pe linia i - 1 de pe care am actualizat d[i][j]
void init() {
for(int i = 0; i <= n; i++)
for(int j = 0; j <= l; j++)
d[i][j] = -1000000000;
}
void gen_d(int t) {
init();
int val;
d[0][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= l; j++)
for(int k = j; k >= 0 && (j - k) * b[i] <= t; k--) {
val = d[i - 1][k] + (t - (j - k) * b[i]) / a[i];
if(val > d[i][j]) {
d[i][j] = val;
pre[i][j] = k;
}
}
}
void gen_path() {
int j = l;
for(int i = n; i >= 1; i--) {
path1[i] = d[i][j] - d[i - 1][pre[i][j]];
path2[i] = j - pre[i][j];
j = pre[i][j];
}
}
int main() {
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int st, dr, t, last;
scanf("%d %d", &n, &l);
for(int i = 1; i <= n; i++)
scanf("%d %d", &a[i], &b[i]);
st = 1;
dr = 100;
while(st <= dr) {
t = (st + dr) / 2;
gen_d(t);
if(d[n][l] >= l) {
last = t;
gen_path();
dr = t - 1;
}
else
st = t + 1;
}
printf("%d\n", last);
for(int i = 1; i <= n; i++)
printf("%d %d\n", path1[i], path2[i]);
return 0;
}