Cod sursa(job #2308849)

Utilizator SemetgTemes George Semetg Data 27 decembrie 2018 20:47:43
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <cstring>
#define N_MAX 105
using namespace std;

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

struct Milk {
    int a, b;
} a[N_MAX];

int N, L;
int dp[N_MAX][N_MAX], sol;
int lapte_bautA[N_MAX][N_MAX];

int litriB_ramasi(int t, int i, int litriA) {
    return (t - a[i].a * litriA) / a[i].b;
}

bool check(int t_max) {
    memset(dp, -0x3f, sizeof(dp));

    dp[0][0] = 0;
    for (int i = 1; i <= N; ++i)
        for (int litriA = 0; litriA <= L && a[i].a * litriA <= t_max; ++litriA)
            for (int litri_totali = litriA; litri_totali <= L; ++litri_totali) {
                int litriB = litriB_ramasi(t_max, i, litriA) + dp[i - 1][litri_totali - litriA];

                if (litriB > dp[i][litri_totali]) {
                    dp[i][litri_totali] = litriB;
                    lapte_bautA[i][litri_totali] = litriA;
                }
            }

    return dp[N][L] >= L;
}

void print(int i, int litriA) {
    if (!i)
        return;

    print(i - 1, litriA - lapte_bautA[i][litriA]);
    out << lapte_bautA[i][litriA] << ' ' << litriB_ramasi(sol, i, lapte_bautA[i][litriA]) << '\n';
}

int main() {
    in >> N >> L;
    for (int i = 1; i <= N; ++i)
        in >> a[i].a >> a[i].b;

    for (int stg = 1, drp = 100; stg <= drp;) {
        int mij = (stg + drp) / 2;

        if (check(mij)) {
            sol = mij;
            drp = mij - 1;
        } else {
            stg = mij + 1;
        }
    }

    check(sol);
    out << sol << '\n';
    print(N, L);
}