Pagini recente » Cod sursa (job #3165873) | Cod sursa (job #909386) | Cod sursa (job #783137) | Cod sursa (job #2568711) | Cod sursa (job #2755301)
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const string filename = "lapte";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");
const int mxn = 100;
int n, L;
pair<int, int> a[mxn + 5];
int dp[mxn + 5][mxn + 5];
pair<int, int> ac[mxn + 5][mxn + 5], sol[mxn + 5][mxn + 5];
vector<pair<int, int> > fnl;
bool f(int t)
{
for (int i = 0; i <= n; ++i)
for (int j = 0; j <= L; ++j)
dp[i][j] = -2e9;
dp[0][0] = 0;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= L; ++j)
for (int x = 0; x <= j; ++x)
{
int y = (t - x * a[i].first) / a[i].second;
if (x * a[i].first <= t && dp[i - 1][j - x] >= 0 && dp[i - 1][j - x] + y > dp[i][j])
{
dp[i][j] = dp[i - 1][j - x] + y;
ac[i][j] = {x, y};
}
}
return dp[n][L] >= L;
}
int main()
{
int ans = 0;
fin >> n >> L;
for (int i = 1; i <= n; ++i)
fin >> a[i].first >> a[i].second;
int st = 1, dr = 1000000, mid;
while (st <= dr)
{
mid = (st + dr) >> 1;
if (f(mid))
{
ans = mid;
dr = mid - 1;
for (int i = 1; i <= n; ++i)
for (int j = 0; j <= L; ++j)
sol[i][j] = ac[i][j];
}
else st = mid + 1;
}
fout << ans << '\n';
int i = n, j = L;
while (i && ~j)
{
fnl.push_back(sol[i][j]);
j -= sol[i][j].first;
i--;
}
reverse(fnl.begin(), fnl.end());
for (auto i : fnl)
fout << i.first << " " << i.second << "\n";
fin.close();
fout.close();
return 0;
}