Pagini recente » Rating Krisan Vlad (KrisanVlad) | Cod sursa (job #732793) | Cod sursa (job #2664181) | Cod sursa (job #1825471) | Cod sursa (job #2602953)
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
using namespace std;
typedef long long ll;
typedef pair <int, int > pii;
int n, l;
pii v[101];
int dp[101][101];
///dp[i][j] - maximul de litri b pe care i bem band j de a si folosing primele i elemente
pii last[101][101];
bool OK(int t) {
int i,j;
for(i = 0; i <= 100; i++) {
for(j = 1; j <= 100; j++) {
dp[i][j] = -2e9;
last[i][j] = last[i][j - 1] = {-1,-1};
}
dp[i][0] = 0;
}
for(i = 1; i <= n; i++) {
for(j = 0; j * v[i].first <= t; j++) {
int ta = j * v[i].first;
int la = j;
int lb = (t - ta) / v[i].second;
for(int k = l; k >= la; k--) {
if(dp[i][k] < dp[i - 1][max(0,k - la)] + lb) {
last[i][k] = {la, lb};
dp[i][k] = dp[i - 1][max(0,k - la)] + lb;
}
}
}
}
return (dp[n][l] >= l);
}
vector <pii> sol;
int main() {
ifstream cin("lapte.in");
ofstream cout("lapte.out");
int i;
cin >> n >> l;
for(i = 1; i <= n; i++) {
cin >> v[i].first >> v[i].second;
}
for(i = 1;i <= 100;i++){
if(OK(i)){
break;
}
}
cout << i << "\n";
int k = n;
pii cv = last[k][l];
while(cv.first != -1 && cv.second != -1 && k >= 1) {
sol.push_back({cv.first , (i - cv.first * v[k].first) / v[k].second});
k--;
l -= cv.first;
l = max(l,0);
cv = last[k][l];
}
for(i = sol.size() - 1; i >= 0; i--) {
cout << sol[i].first << " " << sol[i].second << "\n";
}
return 0;
}