Cod sursa(job #2007563)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 3 august 2017 12:10:08
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
// 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';
}