Cod sursa(job #2085843)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 10 decembrie 2017 20:14:41
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#define DIM 102
#define INF 2e9
#define ff first
#define ss second

using namespace std;

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

int n, l, st;

pair<int, int> pers[DIM], sol[DIM];
int dp[DIM][DIM];

bool calc(int t){
    for(int i = 0; i < DIM; ++ i)
        for(int j = 0; j < DIM; ++ j)
            dp[i][j] = -INF;
    dp[0][0] = 0;
    for(int i = 1; i <= n; ++ i){
        for(int j = 0; j <= l; ++ j){
            for(int k = 0; k <= t / pers[i].ff; ++ k){
                dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + (t - k * pers[i].ff) / pers[i].ss);
            }
        }
    }
    if(dp[n][l] >= l)
        return 1;
    else
        return 0;
}

void rebuild(int t){
    int j = l;
    for(int i = n; i >= 1; -- i){
        for(int k = 0; k <= t / pers[i].ff; ++ k){
            if(dp[i][j] == dp[i - 1][j - k] + (t - k * pers[i].ff) / pers[i].ss){
                sol[i].ff = k;
                sol[i].ss = (t - k * pers[i].ff) / pers[i].ss;
                j -= k;
                break;
            }
        }
    }
}

int main()
{
    f>>n>>l;
    for(int i = 1; i <= n; ++ i)
        f>>pers[i].ff>>pers[i].ss;
    int st = 1;
    int dr = 100;
    //sort(pers + 1, pers + n + 1);
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(calc(mid))
            dr = mid - 1;
        else
            st = mid + 1;
    }
    calc(st);
    rebuild(st);
    g<<st<<'\n';
    for(int i = 1; i <= n; ++ i){
        g<<sol[i].ff<<" "<<sol[i].ss<<'\n';
    }


    return 0;
}