Cod sursa(job #2065820)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 14 noiembrie 2017 11:42:29
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#define DIM 102
#define INF 1000000000
using namespace std;

ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int n,l,i,j,st,dr,mid;
int d[DIM][DIM],sol[DIM][DIM],a[DIM],b[DIM];
int solve (int t){
    for (int i=0;i<=DIM;i++)
        for (int j=0;j<=DIM;j++)
            d[i][j] = -INF;
    d[0][0] = 0;
    for (int i=1;i<=n;i++)
        for (int C=0;C<=t/a[i];C++)
            for (int j=0;j<=l-C;j++){
                int lb = (t - C*a[i]) / b[i];
                if (d[i][j+C] < d[i-1][j] + lb){
                    d[i][j+C] = d[i-1][j] + lb;
                    sol[i][j+C] = C;
                }
            }
    if (d[n][l] >= l)
        return 1;
    return 0;
}
void afisare (int n,int l){
    if (n != 0){
        afisare (n-1,l-sol[n][l]);
        fout<<sol[n][l]<<" "<<d[n][l] - d[n-1][l-sol[n][j]]<<"\n";
    }
}
int main (){

    fin>>n>>l;
    for (i=1;i<=n;i++)
        fin>>a[i]>>b[i];
    /// d[i][j] - cantitatea maxima de lapte b care se poate bea daca primii i au baut j litri de lapte a
    st = 1;
    dr = 100;
    while (st<=dr){
        int mid = (st + dr)/2;
        if (solve(mid))
            dr = mid-1;
        else
            st = mid+1;
    }

    fout<<st<<"\n";
    solve (st);
    /*l -= sol[n][l];
    n--;
    while (n != 0){
        fout<<sol[n][l]<<" "<<d[n][l] - d[n-1][l-sol[n][j]]<<"\n";
        l -= sol[n][l];
        n--;
    }
*/
    afisare (n,l);
    return 0;
}