Pagini recente » Cod sursa (job #3323564) | Cod sursa (job #2682589) | Cod sursa (job #2705403) | Cod sursa (job #1027193) | Cod sursa (job #3334762)
#include <bits/stdc++.h>
#define cin ci
#define cout co
using namespace std;
ifstream cin("lapte.in");
ofstream cout("lapte.out");
const int Nmax = 1e2;
int n, l;
vector<vector<pair<int, int>>> dp;
vector<vector<pair<int, int>>> dp_fin;
vector<pair<int, int>> v;
int ok(int time)
{
dp.assign(n + 5, vector<pair<int ,int>>(l + 5, {-1, 0}));
dp[0][0] = {0, 0};
for(int i = 1; i <= n; i++)
for(int litri = 0; litri <= l; litri ++)
for(int la = 0; la * v[i].first <= time && la <= litri; la ++)
{
int lb = (time - la * v[i].first) / v[i].second;
if(dp[i - 1][litri - la].first != -1)
if(dp[i][litri].first < dp[i - 1][litri - la].first + lb)
{
dp[i][litri].first = dp[i - 1][litri - la].first + lb;
dp[i][litri].second = la;
}
}
if(dp[n][l].first >= l)
{
dp_fin = dp;
return 1;
}
return 0;
}
int main()
{
cin.tie(0);
ios_base::sync_with_stdio(0);
cin >> n >> l;
dp.assign(n + 5, vector<pair<int, int>>(l + 5, {-1, 0}));
v.resize(n + 5);
for(int i = 1; i <= n; i++)
cin >> v[i].first >> v[i].second;
int left = 0, right = 104, ans = -1;
while(left <= right)
{
int mij = (left + right) / 2;
if(ok(mij))
{
ans = mij;
right = mij - 1;
}
else left = mij + 1;
}
cout << ans << '\n';
vector<pair<int, int>> retriv;
int cur = dp_fin[n][l].second;
int litars = l;
int i = n;
while(i)
{
int lb = (ans - cur * v[i].first) / v[i].second;
retriv.push_back({cur, lb});
litars -= cur;
cur = dp_fin[i - 1][litars].second;
i--;
}
reverse(retriv.begin(), retriv.end());
for(auto [i, j] : retriv)
cout << i << " " << j << '\n';
return 0;
}