Pagini recente » Cod sursa (job #178408) | Cod sursa (job #3266551) | Cod sursa (job #2097460) | Cod sursa (job #1121405) | Cod sursa (job #640985)
Cod sursa(job #640985)
#include <stdio.h>
#include <string.h>
#define NMAX 150
int A[NMAX], B[NMAX], dp[NMAX][NMAX], sav[NMAX][NMAX];
int drankA[NMAX], drankB[NMAX];
int n, l;
int solve(int time)
{
int i, j, k;
memset(dp, 0xab, sizeof(dp));
memset(sav, 0, sizeof(sav));
dp[0][0] = 0;
for (i = 0; i < n; ++i)
for (j = 0; j <= l; ++j)
for (k = 0; A[i + 1] * k <= time; ++k) {
if (dp[i + 1][j + k] < dp[i][j] + (time - A[i + 1] * k) / B[i + 1]) {
dp[i + 1][j + k] = dp[i][j] + (time - A[i + 1] * k) / B[i + 1];
sav[i + 1][j + k] = k;
}
}
if (dp[n][l] >= l)
return 1;
return 0;
}
void rec(int time)
{
int i, pos = l;
for (i = n; i; --i) {
drankA[i] = sav[i][pos];
drankB[i] = (time - A[i] * drankA[i]) / B[i];
pos -= sav[i][pos];
}
}
int main()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
int i;
scanf("%d %d", &n, &l);
for (i = 1; i <= n; ++i)
scanf("%d %d", &A[i], &B[i]);
int pos = 0;
int mid, lo = 1, hi = 100;
while (lo <= hi) {
mid = (lo + hi) / 2;
if (solve(mid)) {
pos = mid;
hi = mid - 1;
rec(mid);
}
else
lo = mid + 1;
}
printf("%d\n", pos);
for (i = 1; i <= n; ++i)
printf("%d %d\n", drankA[i], drankB[i]);
return 0;
}