Cod sursa(job #1308477)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 4 ianuarie 2015 05:41:36
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <cstring>
#define DIM 105
#define INF 0x3f3f3f3f

using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,a[DIM],b[DIM],D[DIM][DIM],t[DIM][DIM],l,sol_min;
void drum(int n,int l){
    if(n==0)
        return;
    drum(n-1,l-t[n][l]);
    fout<<t[n][l]<<" "<<(sol_min-a[n]*t[n][l])/b[n]<<"\n";
}
int ok(int x){
    for(int i=0;i<=n;i++){
        for(int j=0;j<=l;j++)
            D[i][j]=-INF;
        D[i][0]=0;
    }
    for(int i=1;i<=n;i++){
        int timpa=x/a[i];
        for(int nra=0;nra<=timpa;nra++){
            int nrb=(x-nra*a[i])/b[i];
            for(int j=l;j>=nra;j--){
                if(D[i][j] < D[i-1][j-nra] + nrb){
                    D[i][j] = D[i-1][j-nra] + nrb;
                    t[i][j]=nra;
                }
            }
        }
    }
    return D[n][l] >= l;
}
int main(){
    fin>>n>>l;
    for(int i=1;i<=n;i++)
        fin>>a[i]>>b[i];
    int m,p=0,u=DIM;
    while(p<=u){
        m=(p+u)/2;
        if(ok(m)){
            sol_min=m;
            u=m-1;
        }
        else
            p=m+1;
    }
    fout<<sol_min<<"\n";
    ok(sol_min);
    drum(n,l);
    fin.close();fout.close();
    return 0;
}