Cod sursa(job #2602961)

Utilizator vladth11Vlad Haivas vladth11 Data 18 aprilie 2020 11:55:17
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 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[101];

int dp[101][101];

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

pii last[101][101];

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;
    }
    int r = 0, pas = 1 << 8;
    while(pas) {
        if(!OK(r + pas))
            r += pas;
        pas /= 2;
    }
    cout << r + 1 << "\n";
    OK(r + 1);
    int k = n;
    pii cv = last[k][l];
    while(cv.first != -1 && cv.second != -1 && k >= 1) {
        sol.push_back(cv);
        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;
}