Pagini recente » Cod sursa (job #184430) | Cod sursa (job #1023045) | Cod sursa (job #880239) | Cod sursa (job #2415142) | Cod sursa (job #2164313)
#include <cstdio>
#include <algorithm>
const int MAX_N = 100;
const int MAX_L = 100;
int a[1 + MAX_N];
int b[1 + MAX_N];
int d[1 + MAX_N][1 + MAX_L];
int x[1 + MAX_N];
int y[1 + MAX_N];
int main() {
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int n, l;
scanf("%d%d", &n, &l);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &a[i], &b[i]);
}
int left = 1;
int right = 100;
while (left <= right) {
int t = (left + right) >> 1;
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100; j++) {
d[i][j] = -100;
}
}
d[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int A = 0; A <= l; A++) {
for (int _A = 0; _A <= t / a[i] && _A <= A; _A++) {
d[i][A] = std::max(d[i][A], d[i - 1][A - _A] + (t - a[i] * _A) / b[i]);
}
}
}
bool sePoate = d[n][l] >= l;
if (sePoate) {
right = t - 1;
} else {
left = t + 1;
}
}
printf("%d\n", left);
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100; j++) {
d[i][j] = -100;
}
}
d[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int A = 0; A <= l; A++) {
for (int _A = 0; _A <= left / a[i] && _A <= A; _A++) {
d[i][A] = std::max(d[i][A], d[i - 1][A - _A] + (left - a[i] * _A) / b[i]);
}
}
}
int last = l;
for (int i = n; i >= 1; i--) {
for (int _A = 0; _A <= left / a[i] && _A <= last; _A++) {
if (d[i][last] == d[i - 1][last - _A] + (left - a[i] * _A) / b[i]) {
x[i] = _A;
y[i] = (left - a[i] * _A) / b[i];
last -= _A;
break;
}
}
}
for (int i = 1; i <= n; i++) {
printf("%d %d\n", x[i], y[i]);
}
return 0;
}