Pagini recente » Cod sursa (job #3134920) | Cod sursa (job #1735814) | Profil DariusPumma | Cod sursa (job #2015848) | Cod sursa (job #2007560)
// 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;
int a[N], b[N], af[N], bf[N], am[N], bm[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;
int dp[105][105];
for (i = 1; i <= n; i++)
am[i] = bm[i] = 0;
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];
am[i] = j;
bm[i] = (L - a[i]*j)/b[i];
}
}
}
return dp[n][l] >= l;
}
int main() {
f >> n >> l;
for (i = 1; i <= n; i++)
f >> a[i] >> b[i];
int p = (1<<30), w = p+1;
for (;p;p/=2) {
if (w-p < 0) continue;
if (valid(w-p)) {
w -= p;
}
}
valid(w);
for (i = 1; i <= n; i++)
af[i] = am[i], bf[i] = bm[i];
g << w << '\n';
for (i = 1; i <= n; i++)
g << af[i] << ' ' << bf[i] << '\n';
;
}