Pagini recente » Cod sursa (job #3030219) | Cod sursa (job #2400101) | Cod sursa (job #1906270) | Cod sursa (job #1966313) | Cod sursa (job #2177191)
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pdd pair<ld, ld>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
const int kMaxN = 100;
int n, min_milk;
int a[kMaxN + 5];
int b[kMaxN + 5];
int ans;
int dp[kMaxN + 5][2 * kMaxN + 5];
pair<pii, pii> how[kMaxN + 5][2 * kMaxN + 5];
bool Check(int t) {
memset(dp, -1, sizeof(dp));
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int how_much_milk_a = 0; a[i] * how_much_milk_a <= t; how_much_milk_a++) {
int rem_time = t - a[i] * how_much_milk_a;
int how_much_milk_b = rem_time / b[i];
for (int k = how_much_milk_a; k <= 2 * kMaxN; k++) {
if (dp[i - 1][k - how_much_milk_a] != -1) {
if (dp[i - 1][k - how_much_milk_a] + how_much_milk_b > dp[i][k]) {
dp[i][k] = dp[i - 1][k - how_much_milk_a] + how_much_milk_b;
how[i][k] = {{i - 1, k - how_much_milk_a}, {how_much_milk_a, how_much_milk_b}};
}
}
}
}
}
for (int i = min_milk; i <= 2 * kMaxN; i++) {
if (dp[n][i] >= min_milk) {
return 1;
}
}
return 0;
}
ofstream fout("lapte.out");
void Print(int i, int j) {
if (i == 0) {
fout << ans << '\n';
return;
}
Print(how[i][j].fi.fi, how[i][j].fi.se);
fout << how[i][j].se.fi << " " << how[i][j].se.se << '\n';
}
int main() {
cin.sync_with_stdio(false);
ifstream cin("lapte.in");
cin >> n >> min_milk;
for (int i = 1; i <= n; i++) {
cin >> a[i] >> b[i];
}
int l = 1;
int r = kMaxN;
ans = r;
while (l <= r) {
int mi = (l + r) / 2;
if (Check(mi)) {
ans = mi;
r = mi - 1;
} else {
l = mi + 1;
}
}
Check(ans);
for (int i = min_milk; i <= 2 * kMaxN; i++) {
if (dp[n][i] >= min_milk) {
Print(n, i);
return 0;
}
}
return 0;
}