Pagini recente » Cod sursa (job #2958561) | Cod sursa (job #2576259) | Cod sursa (job #1527692) | Cod sursa (job #3240326) | Cod sursa (job #3255219)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#define ll long long
#define pii pair<int, int>
#define x first
#define y second
#define int ll
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int MOD = 1e9 + 7;
const char nl = '\n';
const int NMAX = 105;
const int INF = 1e9;
int n, L, dp[NMAX][NMAX];
pii v[NMAX];
vector<pii> ans;
int check(int t){
for(int i = 0; i <= n; i++)
for(int j = 0; j <= L; j++)
dp[i][j] = -INF;
dp[0][0] = 0;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= L; j++){
for(int lA = 0; lA <= j; lA++){
int tB = t - (lA * v[i].x);
if(tB < 0)
break;
int lB = tB / v[i].y;
dp[i][j] = max(dp[i][j], dp[i - 1][j - lA] + lB);
}
}
}
return (dp[n][L] >= L);
}
signed main()
{
in >> n >> L;
for(int i = 1; i <= n; ++i)
in >> v[i].x >> v[i].y;
int t = 0, left = 1, right = 100;
while(left <= right){
int mid = left + (right - left) / 2;
if(check(mid))
right = mid - 1;
else
left = mid + 1;
}
t = right + 1;
out << t << nl;
check(t);
int currA = L, currB = L;
for(int i = n; i >= 1; i--){
for(int lA = 0; lA <= currA; lA++){
int lB = (t - (lA * v[i].x)) / v[i].y;
if(dp[i][currA] == (dp[i - 1][currA - lA] + lB)){
ans.push_back({lA, lB});
currA -= lA;
currB -= lB;
break;
}
}
}
reverse(ans.begin(), ans.end());
for(int i = 0; i < n; i++)
out << ans[i].x << ' ' << ans[i].y << nl;
return 0;
}