Cod sursa(job #1328945)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 28 ianuarie 2015 21:40:49
Problema Lapte Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#define DIM 105
#define INF 0x3f3f3f3f
using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");
int N,D[DIM][DIM],A[DIM],B[DIM],L,solmin,t[DIM][DIM];
void drum(int n,int l){
    if(n==0)
        return;
    drum(n-1,l-t[n][l]);
    fout<<t[n][l]<<" "<<(solmin-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 timp=x/A[i];
        for(int nra=0;nra<=timp;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 p=1,u=DIM;
    while(p<=u){
        int m=(p+u)/2;
        if(ok(m)){
            solmin=m;
            u=m-1;
        }
        else
            p=m+1;
    }
    fout<<solmin<<"\n";
    drum(N,L);
    fin.close();fout.close();
    return 0;
}