Cod sursa(job #3334787)

Utilizator parus_majorParus Major parus_major Data 19 ianuarie 2026 21:01:34
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <climits>

using namespace std;

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

const int MAXN = 102;

int N, L;
int d[MAXN][MAXN], p[MAXN][MAXN];
int A[MAXN], B[MAXN];

bool verif(int cost_max) {
    for (int j = 0; j <= L; ++j)
        d[0][j] = INT_MIN;
    d[0][0] = 0;

    for (int i = 1; i <= N; ++i) {
        for (int j = 0; j <= L; ++j) {
            d[i][j] = INT_MIN;
            for (int t = 0; t <= j && t * A[i] <= cost_max; ++t) {
                if (d[i][j] < d[i - 1][j - t] + (cost_max - t * A[i]) / B[i]) {
                    d[i][j] = d[i - 1][j - t] + (cost_max - t * A[i]) / B[i];
                    p[i][j] = t;
                }
            }
        }
    }
    return d[N][L] >= L;
}

void afis(int i, int j, int cost_max) {
    if (i == 0) return;

    const int cnt_a = p[i][j];
    const int cnt_b = (cost_max - cnt_a * A[i]) / B[i];

    afis(i - 1, j - cnt_a, cost_max);
    fout << cnt_a << ' ' << cnt_b << '\n';
}
int main()
{
    fin >> N >> L;
    for (int i = 1; i <= N; ++i) {
        fin >> A[i] >> B[i];
    }

    int ans = 0;
    for (int i = 8; i >= 0; --i)
        if (!verif(ans + (1 << i))) ans += (1 << i);
    ++ans;

    verif(ans);
    fout << ans << '\n';
    afis(N, L, ans);
    return 0;
}