Cod sursa(job #3040367)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 29 martie 2023 20:08:18
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>

using namespace std;

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

const int nmax = 102;
const int inf = 0x3f3f3f3f;

int n, l, t, sol;
int dp[nmax][nmax], tA[nmax], tB[nmax];
int bestX[nmax][nmax];

bool verify(){
    int y;
    for(int i = 0; i <= n; i++)
        for (int j = 0; j <= l; j++)
            dp[i][j] = -inf, bestX[i][j] = 0;

    dp[0][0] = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= l; j++) {
            for (int x = 0; x * tA[i] <= t && x <= j; x++){
                y = t - x * tA[i];
                if(dp[i - 1][j - x] + y / tB[i] > dp[i][j]){
                    dp[i][j] = dp[i - 1][j - x] + y / tB[i];
                    bestX[i][j] = x;
                }
            }
        }
    }

    return (dp[n][l] >= l);
}

void reconst(int i, int j) {
    if(i == 0){
        return;
    }
    int x = bestX[i][j];
    int y = (sol - x * tA[i]) / tB[i];
    reconst(i - 1, j - x);
    fout << x << " " << y <<"\n";
}

int main(){

    fin >> n >> l;
    for (int i = 1; i <= n; i++)
        fin >> tA[i] >> tB[i];

    int st, dr;
    st = 0;
    dr = 20000;
    while (st <= dr) {
        t = (st + dr) / 2;
        if (verify ()) {
            sol = t;
            dr = t - 1;
        }
        else{
            st = t + 1;
        }
    }

    fout << sol << '\n';

    t = sol;
    verify();
    reconst(n, l);

    return 0;
}