Pagini recente » Cod sursa (job #876051) | Cod sursa (job #107043) | Cod sursa (job #1169830) | Cod sursa (job #1571824) | Cod sursa (job #2007563)
// Este pacat sa rezolv problema asta in post?
// Poate ca da, pentru ca ii fac pe altii sa bea lapte.
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
const int N = 105, f_mare = 1e9;
int l, n, i, j;
int a[N], b[N], af[N], bf[N];
int dp[N][N], cat[N][N];
bool valid(int L) { // cat lapte B se consuma in functie de laptele A: din timpul ramas L - (k*a[i]) al fiecarui
// concurent i se bea atata lapte B cat sa se incadreze in timp
int i, j, w;
for (i = 0; i <= 101; i++)
for (j = 0; j <= 101; j++)
dp[i][j] = -f_mare;
dp[0][0] = 0;
for (i = 1; i <= n; i++)
for (w = 0; w <= l; w++)
for (j = 0; j <= L/a[i] && j <= w; j++)
if (dp[i-1][w-j] + (L - a[i]*j)/b[i] > dp[i][w]) {
dp[i][w] = dp[i-1][w-j] + (L - a[i]*j)/b[i];
cat[i][w] = j;
}
return dp[n][l] >= l;
}
int main() {
f >> n >> l;
for (i = 1; i <= n; i++)
f >> a[i] >> b[i];
int p = 128, w = p+1;
for (;p;p/=2) {
if (w-p < 0) continue;
if (valid(w-p)) {
w -= p;
}
}
valid(w);
j = l;
for (i = n; i >= 1; i--) {
af[i] = cat[i][j];
bf[i] = (w-af[i]*a[i])/b[i];
j -= cat[i][j];
}
g << w << '\n';
for (i = 1; i <= n; i++)
g << af[i] << ' ' << bf[i] << '\n';
}