Cod sursa(job #1820960)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 2 decembrie 2016 13:32:50
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>

using namespace std;

ifstream fin ("lapte.in");
ofstream fout ("lapte.out");

int n, l, i, j, k, p, q, a[110], b[110], d[110], c[110][110], v[110][110], P[110][110], maxim, s, t, nr, x;

int main() {
    fin >> n >> l;
    for (i = 1; i <= n; ++i) {
        fin >> a[i] >> b[i];
    }
    q = 101;
    while (p + 1 < q) {
        t = (p + q) / 2;
        for (i = 0; i < 101; ++i) {
            for (j = 0; j < 101; ++j) {
                c[i][j] = 0;
                v[i][j] = 0;
                P[i][j] = 0;
            }
        }
        for (j = 0; j <= t / a[1]; ++j) {
            c[1][j] = (t - a[1] * j) / b[1];
            v[1][j] = j;
            P[1][j] = 1;

        }
        for (i = 2; i <= n; ++i) {
            for (j = 0; j <= l; ++j) {
                maxim = -1;
                nr = 0;
                for (k = 0; k <= j; ++k) {
                    if (a[i] * k <= t) {
                        x = (t - a[i] * k) / b[i];
                        if (c[i - 1][j - k] + x> maxim && P[i - 1][j - k] == 1) {
                            maxim = c[i - 1][j - k] + x;
                            nr = k;
                        }
                    } else {
                        break;
                    }
                }
                c[i][j] = maxim;
                v[i][j] = nr;
                if (maxim == -1) {
                    P[i][j] = 0;
                } else {
                    P[i][j] = 1;
                }
            }
        }
        if (c[n][l] >= l) {
            s = t;
            k = l;
            for (i = n; i > 0; --i) {
                d[i] = v[i][k];
                k -= v[i][k];
            }
            q = t;
        } else {
            p = t;
        }
    }
    fout << s << "\n";
    for (i = 1; i <= n; ++i) {
        fout << d[i] << ' ';
        k = (s - d[i] * a[i]) / b[i];
        fout << k << "\n";
    }
    return 0;
}