Cod sursa(job #2113772)

Utilizator luanastLuana Strimbeanu luanast Data 25 ianuarie 2018 01:36:23
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout ("lapte.out");
int n,L,i,j,k,T,A[110],B[110],D[110][110],p,u,b;
struct solutie{
    int tipa,tipb;
}sol[110];
int main(){
    fin>>n>>L;
    for(i=1;i<=n;i++)
        fin>>A[i]>>B[i];
    p=1;u=101;
    while(p<=u){
        T=(p+u)/2;
        for(i=0;i<=109;i++)
            for(j=0;j<=109;j++)
                D[i][j]=-100000000;
        D[0][0]=0;
        for(i=1;i<=n;i++)
            for(j=0;j<=L;j++)
                for(k=0;k<=T/A[i] && k<=j;k++){
                    b=(T-k*A[i])/B[i];
                    D[i][j]=max(D[i][j],D[i-1][j-k]+b);
                }

        if(D[n][L]>=L)
            u=T-1;
        else
            p=T+1;
    }
    for(i=0;i<=109;i++)
        for(j=0;j<=109;j++)
            D[i][j]=-10000000;
    D[0][0]=0;
    for(i=1;i<=n;i++)
        for(j=0;j<=L;j++)
            for(k=0;k<=p/A[i] && k<=j;k++){
                b=(p-k*A[i])/B[i];
                D[i][j]=max(D[i][j],D[i-1][j-k]+b);
            }
    for(i=n;i>=1;i--)
        for(k=0;k<=p/A[i];k++){
            b=(p-A[i]*k)/B[i];
            if(D[i][L]==D[i-1][L-k]+b){
                sol[i].tipa=k;
                sol[i].tipb=b;
                L-=k;
                break;
            }
        }
    fout<<p<<"\n";
    for(i=1;i<=n;i++)
        fout<<sol[i].tipa<<" "<<sol[i].tipb<<"\n";
}