Cod sursa(job #2112474)

Utilizator osiaccrCristian Osiac osiaccr Data 23 ianuarie 2018 15:18:13
Problema Lapte Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#define DEF 110
#define INF 1 << 29

using namespace std;

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

int D[DEF][DEF], A[DEF], B[DEF], n, l;

pair < int , int > sol[DEF];

bool calc (int T) {
    for (int i = 0; i < DEF; ++ i) {
        for (int j = 0; j < DEF; ++ j) {
            D[i][j] = - INF;
        }
    }


    D[0][0] = 0;
    for (int i = 1; i <= n; ++ i) {
        for (int j = 0; j <= l; ++ j) {
            for (int k = 0; k <= T / A[i] && k <= j; ++ k) {
                int b = (T - k * A[i]) / B[i];

                if (D[i][j] < D[i - 1][j - k] + b) {
                    sol[i].first = k;
                    sol[i].second = b;
                    D[i][j] = D[i - 1][j - k] + b;
                }
            }
        }
    }
    return D[n][l] >= l;

}

int main() {
    fin >> n >> l;

    for (int i = 1; i <= n; ++ i) {
        fin >> A[i] >> B[i];
    }

    int st = 1, dr = 100, mid;
    while (st <= dr) {
        mid = (st + dr) / 2;
        if (calc (mid)) {
            dr = mid - 1;
        }
        else {
            st = mid + 1;
        }
    }

    calc (st);

    fout << st << "\n";
    for (int i = 1; i <= n; ++ i) {
        fout << sol[i].first << " " << sol[i].second << "\n";
    }

    return 0;
}