Pagini recente » Cod sursa (job #1119656) | Cod sursa (job #11258) | Cod sursa (job #221328) | Cod sursa (job #1780197) | Cod sursa (job #2920656)
#include <fstream>
using namespace std;
ifstream in ("lapte.in");
ofstream out ("lapte.out");
const int max_size = 1e2 + 1;
long long dp[max_size][max_size], a[max_size], b[max_size], ans[max_size][max_size], n, l, sol;
bool check (int t)
{
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= l; j++)
{
dp[i][j] = 0;
ans[i][j] = 0;
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 0; j <= l; j++)
{
for (int k = 0;k <= j && k * a[i] <= t; k++)
{
if (dp[i][j] < dp[i - 1][j - k] + (t - k * a[i]) / b[i])
{
dp[i][j] = dp[i - 1][j - k];
dp[i][j] += (t - k * a[i]) / b[i];
ans[i][j] = k;
}
}
}
}
if (dp[n][l] >= l)
{
return true;
}
return false;
}
void rez (int i, int j)
{
if (i == 0)
{
return;
}
int x = ans[i][j], y = (sol - x * a[i]) / b[i];
rez(i - 1, j - x);
out << x << " " << y << '\n';
}
int main ()
{
in >> n >> l;
for (int i = 1; i <= n; i++)
{
in >> a[i] >> b[i];
}
int e = 64;
for (int st = 0; e > 0; e >>= 1)
{
if (check(e + st))
{
sol = e + st;
}
else
{
st += e;
}
}
out << sol << '\n';
check(sol);
rez(sol, l);
in.close();
out.close();
return 0;
}