Pagini recente » Cod sursa (job #999970) | Cod sursa (job #1897348) | Cod sursa (job #2239534) | Cod sursa (job #1657464) | Cod sursa (job #2532290)
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
ifstream in("lapte.in");
ofstream out("lapte.out");
int a[N], b[N], dp[N][N], from[N][N];
// dp[i][j] --> cantitatea de lapte b, luand cel putin j litri din laptele A, baute de i oameni
int n, l;
bool check(int time) {
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= l; j++) {
dp[i][j] = -1e9;
}
}
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= l; j++) {
for (int k = 0; k * a[i] <= time && k <= j; k++) {
if (dp[i][j] < dp[i - 1][j - k] + (time - a[i] * k) / b[i]) {
from[i][j] = j - k;
dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + (time - a[i] * k) / b[i]);
}
}
}
}
if (dp[n][l] >= l) {
return true;
}
return false;
}
int main() {
in >> n >> l;
for (int i = 1; i <= n; i++) {
in >> a[i] >> b[i];
}
int st = 0, dr = 105, ans = 0;
while(st <= dr) {
int mid = (st + dr) / 2;
if (check(mid)) {
ans = mid;
dr = mid - 1;
}
else {
st = mid + 1;
}
}
check(ans);
vector < pair < int, int > > rs(N);
int x = n, length = 0;
while(x) {
rs[++length].first = l - from[x][l];
rs[length].second = dp[x][l] - dp[x - 1][from[x][l]];
l = from[x][l];
x--;
}
out << ans << "\n";
for (int i = length; i >= 1; i--) {
out << rs[i].first << " " << rs[i].second << "\n";
}
return 0;
}