Pagini recente » Cod sursa (job #1819209) | Cod sursa (job #2303477) | Cod sursa (job #2365082) | Cod sursa (job #2755987) | Cod sursa (job #1250260)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int n, l, a[105], b[105];
int d[105][105];
int x[105][105];
struct laptic {
int lapte_a, lapte_b;
};
vector < laptic > v;
void ok(int t) {
memset(d, 0, sizeof(d));
for(int i = 1; i <= l; ++ i) {
d[0][i]=-1000000000;
}
for(int i = 1; i <= n ; ++ i) {
for(int j = 0; j <= l; ++ j) {
x[i][j] = 0;
d[i][j] = d[i - 1][j] + t / b[i];
for(int k = 0; k <= t / a[i] && k <= j; ++ k) {
if(d[i][j] < d[i - 1][j - k] + (t - k * a[i]) / b[i]) {
d[i][j] = d[i - 1][j - k] + (t - k * a[i]) / b[i];
x[i][j] = k;
}
}
}
}
}
int binar(int st, int dr) {
int last, med;
last = dr;
while(st<=dr) {
med = st + (dr - st) / 2;
ok(med);
if(d[n][l] >= l) {
last = med;
dr = med - 1;
}else {
st = med + 1;
}
}
return last;
}
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 last = binar(1, l * (a[1] + b[1]));
printf("%d\n", last);
int m = 0;
laptic aux;
for(int i = n; i >= 1; -- i) {
aux.lapte_a = x[i][l];
aux.lapte_b = (last - aux.lapte_a * a[i]) / b[i];
v.push_back(aux);
l -= x[i][l];
++ m;
}
for(int i = m - 1; i >= 0; --i) {
printf("%d %d\n", v[i].lapte_a, v[i].lapte_b);
}
return 0;
}