Cod sursa(job #2113754)

Utilizator Liviu_Ionut_MoantaMoanta Ionut Liviu Liviu_Ionut_Moanta Data 25 ianuarie 2018 00:06:23
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<fstream>
using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,i,j,l,st,dr,mid,b1;
int a[101],b[101];
int d[101][101];
pair<int,int>sol[101];
int f(int mid){
    for(int i=0;i<101;i++){
        for(int j=0;j<101;j++){
            d[i][j]=-1000;
        }
    }
    d[0][0]=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=l;j++){
            for(int k=0;k<=mid/a[i]&&k<=j;k++){
                int b1=(mid-k*a[i])/b[i];
                d[i][j]=max(d[i][j],d[i-1][j-k]+b1);
            }
        }
    }
    if(d[n][l]>=l){
        return 1;
    }
    return 0;
}
int main(){
    fin>>n>>l;
    for(i=1;i<=n;i++){
        fin>>a[i]>>b[i];
    }
    st=1;
    dr=101;
    while(st<=dr){
        mid=(st+dr)/2;
        if(f(mid)==1){
            dr=mid-1;
        }
        else{
            st=mid+1;
        }
    }
    fout<<st<<"\n";
    f(st);
    for(i=n;i>=1;i--){
        for(j=0;j<=st/a[i];j++){
            b1=(st-j*a[i])/b[i];
            if(d[i][l]==d[i-1][l-j]+b1){
                sol[i].first=j;
                sol[i].second=b1;
                l-=j;
                break;
            }
        }
    }
    for(i=1;i<=n;i++){
        fout<<sol[i].first<<" "<<sol[i].second<<"\n";
    }
    return 0;
}