Pagini recente » Cod sursa (job #686041) | Cod sursa (job #1460664) | Cod sursa (job #138465) | Cod sursa (job #1692837) | Cod sursa (job #2260992)
#include <bits/stdc++.h>
using namespace std;
ifstream fi("lapte.in");
ofstream fo("lapte.out");
const int N = 105;
int dp[N][N], fst[N][N], a[N], b[N], ra[N], rb[N];
int n, milk;
static bool check(int tid) {
memset(dp, 0xfe, sizeof dp);
dp[0][0] = 0;
for (int drunk = 1; drunk <= n; ++drunk) { // iteram betivul satului
for (int pos = milk; pos >= 0; --pos)
for (int s, f = 0; f * a[drunk] <= tid && f <= pos; ++f) {
s = (tid - f * a[drunk]) / b[drunk];
if (dp[drunk][pos] <= s + dp[drunk - 1][pos - f]) {
fst[drunk][pos] = f;
dp[drunk][pos] = s + dp[drunk - 1][pos - f]; } } }
return dp[n][milk] >= milk; }
int main() {
int tmp, idx, tid;
fi >> n >> milk;
for (int i = 1; i <= n; ++i)
fi >> a[i] >> b[i];
tid = 0;
for (int msk = 1 << 14; msk > 0; msk/= 2) //check bound
if (!check(tid + msk))
tid+= msk;
check(++tid);
tmp = milk;
for (int i = n; i >= 1; --i) {
ra[i] = fst[i][tmp];
rb[i] = (tid - fst[i][tmp] * a[i]) / b[i];
tmp-= fst[i][tmp]; }
fo << tid << '\n';
for (int i = 1; i <= n; ++i)
fo << ra[i] << ' ' << rb[i] << '\n';
return 0; }