Cod sursa(job #1358796)

Utilizator AndyCatrunaCatruna Andy AndyCatruna Data 24 februarie 2015 20:01:06
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,l,i,A[105],B[105],D[105][105],T[105][105],sol,st,dr,mid;
void drum(int n, int l){
    if(n==0){
        return;
    }
    else{
        drum(n-1,l-T[n][l]);
        fout<<T[n][l]<<" "<<(sol-A[n]*T[n][l])/B[n]<<"\n";
    }

}
 //D[i][j] = nr max de litri de lapte B daca bem i litri A cu j persoane;
int verif(int x){
    for(int i=0; i<=n;i++){
        for(int j=0;j<=l;j++){
            D[i][j]=-100000990;
        }
        D[i][0]=0;
    }
    for(i=1;i<=n;i++){
        int litA=x/A[i];
        for(int a = 0; a<=litA;a++){
            int b = (x-a*A[i])/B[i];
            for(int j=l;j>=a;j--){
                if(D[i][j]<D[i-1][j-a]+b){
                    D[i][j]=D[i-1][j-a]+b;
                    T[i][j]=a;
                }
            }
        }
    }
    if(D[n][l]>=l){
        return 1;
    }
    else{
        return 0;
    }

}
int main(){
    fin>>n>>l;
    for(i=1;i<=n;i++){
        fin>>A[i]>>B[i];
    }
    st=1;dr=105;
    while(st<=dr){
        mid=(st+dr)/2;
        if(verif(mid)){
            sol=mid;
            dr=mid-1;
        }
        else{
            st=mid+1;
        }


    }
    fout<<sol<<"\n";
    verif(sol);
    drum(n,l);



    return 0;
}