Pagini recente » Cod sursa (job #1783075) | Cod sursa (job #96771) | Cod sursa (job #215421) | Cod sursa (job #160314) | Cod sursa (job #2149746)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, l, d[105][105], urm[105][105];
bool r[105][105];
struct miau{int x, y;} v[105], rasp[105];
bool check(int t) {
memset(d, 0, sizeof(d));
memset(r, 0, sizeof(r));
r[0][0] = 1;
for (int i = 1; i <= n; ++i) {
int maxa = min(l, t / v[i].x);
for (int j = 0; j <= l; ++j) {
for (int k = 0; k <= maxa; ++k)
if (r[i - 1][max(j - k, 0)] && d[i][j] <= d[i - 1][max(j - k, 0)] + (t - k * v[i].x) / v[i].y) {
r[i][j] = 1;
d[i][j] = d[i - 1][max(j - k, 0)] + (t - k * v[i].x) / v[i].y;
urm[i][j] = min(k, j);
}
}
}
return d[n][l] >= l;
}
int cautbin() {
int rez = 0, pas = 1 << 8;
while (pas) {
if (rez + pas <= 100 && !check(rez + pas)) rez += pas;
pas /= 2;
}
return rez + 1;
}
int main()
{
f >> n >> l;
for (int i = 1; i <= n; ++i) f >> v[i].x >> v[i].y;
int ans = cautbin();
g << ans << '\n';
check(ans);
int poz = n, q = l;
while (poz) {
int dif = urm[poz][q];
rasp[poz].x = dif;
rasp[poz].y = (ans - dif * v[poz].x) / v[poz].y;
q -= dif;
--poz;
}
for (int i = 1; i <= n; ++i) g << rasp[i].x << ' ' << rasp[i].y << '\n';
return 0;
}