Cod sursa(job #2218090)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 3 iulie 2018 12:52:36
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");

const int NMAX = 105;
int a[NMAX], b[NMAX], dp[NMAX][NMAX], n, l, sol_A[NMAX], sol_B[NMAX];
pair<int, int> from[NMAX][NMAX];

bool possible(int val) {
    for(int i = 0; i <= n; i ++)
        for(int j = 0; j <= l; j ++)
            dp[i][j] = -1;
    dp[0][0] = 0;
    for(int i = 1; i <= n; i ++)
        for(int j = 0; j <= l; j ++)
            for(int k = 0; k <= j && k * a[i] <= val; k ++)
                if(dp[i - 1][j - k] >= 0 && dp[i][j] < dp[i - 1][j - k] + (val - a[i] * k) / b[i]) {
                    dp[i][j] = dp[i - 1][j - k] + (val - a[i] * k) / b[i];
                    from[i][j] = {i - 1, j - k};
                }
    return dp[n][l] >= l;
}

int main() {
    ios::sync_with_stdio(false);
    in >> n >> l;
    for(int i = 1; i <= n; i ++)
        in >> a[i] >> b[i];
    int ans = 0;
    for(int step = 1 << 8; step != 0; step >>= 1)
        if(!possible(ans + step))
            ans += step;
    ans ++;
    possible(ans);
    int i = n, j = l;
    while(i != 0) {
        int newi = from[i][j].first, newj = from[i][j].second;
        sol_A[i] = j - newj, sol_B[i] = dp[i][j] - dp[newi][newj];
        i = newi, j = newj;
    }
    out << ans << "\n";
    for(int i = 1; i <= n; i ++)
        out << sol_A[i] << " " << sol_B[i] << "\n";
    return 0;
}