Pagini recente » Cod sursa (job #2314596) | Cod sursa (job #509128) | Cod sursa (job #1466058) | Cod sursa (job #1246541) | Cod sursa (job #2443617)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int NMAX = 105;
const int INF = (1 << 30);
int speeda[NMAX], speedb[NMAX];
pair <int, int> milk[NMAX][NMAX];
int n, l;
bool Check(int xtime)
{
vector < vector <int> > dp(n + 1, vector <int> (l + 1, -INF));
dp[0][0] = 0;
for (int i = 1;i <= n;++i)
for (int milka = 0;milka <= l && milka * speeda[i] <= xtime;++milka)
{
int milkb = (xtime - milka * speeda[i]) / speedb[i];
for (int j = milka;j <= l;++j)
if (dp[i][j] < dp[i - 1][j - milka] + milkb)
{
milk[i][j] = make_pair(milka, milkb);
dp[i][j] = dp[i - 1][j - milka] + milkb;
}
}
return dp[n][l] >= l;
}
int main()
{
ifstream fin("lapte.in");
ofstream fout("lapte.out");
fin >> n >> l;
for (int i = 1;i <= n;++i)
fin >> speeda[i] >> speedb[i];
int left = 1, right = 100, mid, ans = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (Check(mid))
{
ans = mid;
right = mid - 1;
}
else
left = mid + 1;
}
fout << ans << "\n";
Check(ans);
vector < pair <int, int> > vals;
for (int i = n, pos = l;i >= 1;pos -= milk[i][pos].first, --i)
vals.push_back(milk[i][pos]);
reverse(vals.begin(), vals.end());
for (auto &x : vals)
fout << x.first << " " << x.second << "\n";
fin.close();
fout.close();
return 0;
}