Pagini recente » Cod sursa (job #1617270) | Cod sursa (job #1079839) | Cod sursa (job #1525568) | Cod sursa (job #2793968) | Cod sursa (job #2811437)
#include <bits/stdc++.h>
#define DIM 105
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int n, m, dp[DIM][DIM], tata[DIM][DIM], x[DIM], y[DIM], litri, ans;
bool ok(int t)
{
bool ok1 = 0;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= litri; j++)
dp[i][j] = -1;
for (int j = 0; j < min(litri, t / x[1]); j++)
{
dp[1][j] = (t - j * x[1]) / y[1];
tata[1][j] = j;
}
for (int i = 2; i <= n; i++)
for (int j = 0; j <= min(litri, t / x[1]); j++)
for (int k = 0; k <= litri - j; k++)
if (dp[i - 1][k] != -1 && dp[i][j + k] < dp[i - 1][k] + (t - j * x[i]) / y[i])
{
dp[i][j + k] = dp[i - 1][k] + (t - j * x[i]) / y[i];
tata[i][j + k] = j;
if (dp[i][j + k] >= litri && k + j == litri)
ok1 = 1;
}
return ok1;
}
void path(int n, int litri)
{
if(n == 0)
return ;
path(n - 1, litri - tata[n][litri]);
g << tata[n][litri] << " " << (ans - tata[n][litri] * x[n]) / y[n] << "\n";
}
int main()
{
f >> n >> litri;
for (int i = 1; i <= n; i++)
f >> x[i] >> y[i];
int st = 1, dr = litri * (x[1] + y[1]);
while (st <= dr)
{
int mid = (st + dr) >> 1;
if (ok(mid))
dr = mid - 1;
else
st = mid + 1;
}
ans = st;
ok(ans);
g << ans << "\n";
path(n, litri);
return 0;
}