Pagini recente » Cod sursa (job #2036271) | Cod sursa (job #235083) | Cod sursa (job #2909058) | Cod sursa (job #257035) | Cod sursa (job #2218090)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int NMAX = 105;
int a[NMAX], b[NMAX], dp[NMAX][NMAX], n, l, sol_A[NMAX], sol_B[NMAX];
pair<int, int> from[NMAX][NMAX];
bool possible(int val) {
for(int i = 0; i <= n; i ++)
for(int j = 0; j <= l; j ++)
dp[i][j] = -1;
dp[0][0] = 0;
for(int i = 1; i <= n; i ++)
for(int j = 0; j <= l; j ++)
for(int k = 0; k <= j && k * a[i] <= val; k ++)
if(dp[i - 1][j - k] >= 0 && dp[i][j] < dp[i - 1][j - k] + (val - a[i] * k) / b[i]) {
dp[i][j] = dp[i - 1][j - k] + (val - a[i] * k) / b[i];
from[i][j] = {i - 1, j - k};
}
return dp[n][l] >= l;
}
int main() {
ios::sync_with_stdio(false);
in >> n >> l;
for(int i = 1; i <= n; i ++)
in >> a[i] >> b[i];
int ans = 0;
for(int step = 1 << 8; step != 0; step >>= 1)
if(!possible(ans + step))
ans += step;
ans ++;
possible(ans);
int i = n, j = l;
while(i != 0) {
int newi = from[i][j].first, newj = from[i][j].second;
sol_A[i] = j - newj, sol_B[i] = dp[i][j] - dp[newi][newj];
i = newi, j = newj;
}
out << ans << "\n";
for(int i = 1; i <= n; i ++)
out << sol_A[i] << " " << sol_B[i] << "\n";
return 0;
}