Pagini recente » Cod sursa (job #1939751) | Cod sursa (job #2417320) | Cod sursa (job #1588880) | Cod sursa (job #2649798) | Cod sursa (job #2065398)
# include <bits/stdc++.h>
using namespace std;
const int Nmax = 1e2 + 5;
struct da{int x, y;};
da a[Nmax], ans[Nmax];
int dp[Nmax][Nmax], drum[Nmax][Nmax], n, l, sol;
void input()
{
scanf("%d %d\n", &n, &l);
for (int i = 1; i <= n; ++i)
scanf("%d %d\n", &a[i].x, &a[i].y);
}
bool solve(int T)
{
int i, j, k;
memset(dp, 0, sizeof(dp));
memset(drum, 0, sizeof(drum));
for (i = 0; i <= n; ++i)
for (j = 1; j <= l; ++j)
dp[i][j] = -1;
for (i = 1; i <= n; ++i)
for (j = 0; j <= l; ++j)
for (k = 0; k <= min(T / a[i].x, j); ++k)
{
if (dp[i-1][j - k] == -1) continue;
if (dp[i][j] >= dp[i - 1][j - k] + (T - (k * a[i].x)) / a[i].y) continue;
dp[i][j] = dp[i - 1][j - k] + (T - (k * a[i].x)) / a[i].y;
drum[i][j] = k;
}
if (dp[n][l] >= l) return true;
return false;
}
void recons()
{
for (int i = n; i >= 1; --i)
{
ans[i].x = drum[i][l];
l -= ans[i].x;
ans[i].y = (sol - a[i].x * ans[i].x) / a[i].y;
}
}
void compute()
{
int left = 0, right = (a[1].x + a[1].y) * l, mid;
while (left <= right)
{
mid = (left + right) >> 1;
if (solve(mid)) sol = mid, right = mid - 1;
else left = mid + 1;
}
recons();
}
void output()
{
printf("%d\n", sol);
for (int i = 1; i <= n; ++i)
printf("%d %d\n", ans[i].x, ans[i].y);
}
int main ()
{
freopen("lapte.in", "r", stdin);
freopen("lapte.out", "w", stdout);
input();
compute();
output();
return 0;
}