Pagini recente » Cod sursa (job #1125644) | Cod sursa (job #142710) | Cod sursa (job #1106030) | Cod sursa (job #1904629) | Cod sursa (job #3133165)
#include <fstream>
using namespace std;
ifstream in ("lapte.in");
ofstream out ("lapte.out");
const int max_size = 1e2 + 5, INF = 1e9;
int dp[max_size][max_size], ans[max_size][max_size], a[max_size], b[max_size], n, l, sol;
bool check (int t)
{
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= l; j++)
{
dp[i][j] = -INF;
ans[i][j] = 0;
}
}
dp[0][0] = 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] + (t - k * a[i]) / b[i];
ans[i][j] = k;
}
}
}
}
// out << t << " " << dp[n][l] << '\n';
if (dp[n][l] >= l)
{
return true;
}
return false;
}
void rez (int i, int j)
{
if (i == 0)
{
return;
}
rez(i - 1, j - ans[i][j]);
out << ans[i][j] << " " << (sol - ans[i][j] * a[i]) / b[i] << '\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(st + e))
{
sol = st + e;
}
else
{
st += e;
}
}
out << sol << '\n';
check(sol);
rez(n, l);
in.close();
out.close();
return 0;
}