Cod sursa(job #2602958)

Utilizator vladth11Vlad Haivas vladth11 Data 18 aprilie 2020 11:40:52
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.69 kb

#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"

using namespace std;
typedef long long ll;
typedef pair <int, int > pii;

int n, l;
pii v[103];

int dp[103][103];

///dp[i][j] - maximul de litri b pe care i bem band j de a si folosing primele i elemente

pii last[103][103];

bool OK(int t) {
    int i,j;
    for(i = 0; i <= 100; i++) {
        for(j = 1; j <= 100; j++) {
            dp[i][j] = -2e9;
            last[i][j] = last[i][j - 1] = {-1,-1};
        }
        dp[i][0] = 0;
    }
    for(i = 1; i <= n; i++) {
        for(j = 0; j * v[i].first <= t; j++) {
            int ta = j * v[i].first;
            int la = j;
            int lb = (t - ta) / v[i].second;

            for(int k = l; k >= 0; k--) {
                if(dp[i][k] <= dp[i - 1][max(0,k - la)]  + lb) {
                    last[i][k] = {la, lb};
                    dp[i][k] = dp[i - 1][max(0,k - la)]  + lb;
                }
            }
        }
    }

    return (dp[n][l] >= l);
}
vector <pii> sol;
int main() {
    ifstream cin("lapte.in");
    ofstream cout("lapte.out");
    int i;
    cin >> n >> l;
    for(i = 1; i <= n; i++) {
        cin >> v[i].first >> v[i].second;
    }
    for(i = 1;i <= 100;i++){
        if(OK(i)){
            break;
        }
    }
    cout << i << "\n";
    int k = n;
    pii cv = last[k][l];
    while(k >= 1) {
        sol.push_back({cv.first , (i - cv.first * v[k].first) / v[k].second});
        k--;
        l -= cv.first;
        l = max(l,0);
        cv = last[k][l];
    }
    for(i = sol.size() - 1; i >= 0; i--) {
        cout << sol[i].first << " " << sol[i].second << "\n";
    }
    return 0;
}