Pagini recente » Cod sursa (job #931512) | Cod sursa (job #1481729) | Cod sursa (job #504404) | Cod sursa (job #1386992) | Cod sursa (job #2363687)
#include <bits/stdc++.h>
using namespace std;
struct ura {
int a;
int b;
};
const int MAXN = 100;
ura v[MAXN + 1], rez[MAXN + 1];
int dp[MAXN + 1][MAXN + 1];
int last[MAXN + 1][MAXN + 1];
int l, n;
bool check (int t) {
int i, j, k;
for (i = 1; i <= n; i++)
for (j = 0; j <= l; j++)
dp[i][j] = -1;
memset (last, 0, sizeof (last));
for (i = 0; i <= l && i * v[1].a <= t; i++)
dp[1][i] = (t - i * v[1].a) / v[1].b;
for (i = 2; i <= n; i++) {
for (j = 0; j <= l; j++) {
for (k = 0; k <= j; k++) {
if ((j - k) * v[i].a <= t) {
if (dp[i - 1][k] >= 0 && dp[i][j] < dp[i - 1][k] + (t - (j - k) * v[i].a) / v[i].b) {
dp[i][j] = dp[i - 1][k] + (t - (j - k) * v[i].a) / v[i].b;
last[i][j] = k;
}
}
}
}
}
return (dp[n][l] >= l);
}
int main() {
int st, dr, sol, k, i;
freopen ("lapte.in", "r", stdin);
freopen ("lapte.out", "w", stdout);
scanf ("%d%d", &n, &l);
for (i = 1; i <= n; i++)
scanf ("%d%d", &v[i].a, &v[i].b);
st = 1;
dr = 100;
while (st <= dr) {
int mij = (st + dr) / 2;
if (check (mij) == true) {
sol = mij;
dr = mij - 1;
}
else
st = mij + 1;
}
printf ("%d\n", sol);
check (sol);
k = l;
for (i = n; i > 0; i--) {
rez[i].b = dp[i][k] - dp[i - 1][last[i][k]];
rez[i].a = k - last[i][k];
k = last[i][k];
}
for (i = 1; i <= n; i++)
printf ("%d %d\n", rez[i].a, rez[i].b);
return 0;
}