Cod sursa(job #2374681)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 7 martie 2019 19:57:14
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
using namespace std;

ifstream fin("lapte.in");
ofstream fout("lapte.out");

int n,l,i,j,k,v[101][101],t,st,dr;
int a[101],b[101];
int d[101][101];

void afis(int n,int l){
    if(n>0){
        afis(n-1,l-d[n][l]);

        fout<<d[n][l]<<" "<<(st-d[n][l]*a[n])/b[n]<<"\n";
    }
}

int main(){
    fin>>n>>l;
    for(i=1;i<=n;i++){
        fin>>a[i]>>b[i];
    }

    st=1; dr=100;
    while(st<=dr){
        t=(st+dr)/2;

        for(i=1;i<=n;i++)
            for(j=0;j<=l;j++)
                v[i][j]=-1;

        for(j=0;j<=min(t/a[1],l);j++){
            v[1][j]=(t-j*a[1])/b[1];
            d[1][j]=j;
        }

        for(i=2;i<=n;i++){
            for(j=0;j<=min(t/a[i],l);j++){

                for(k=0;k+j<=l;k++){
                    if(v[i-1][k]!=-1){
                        if(v[i][j+k]==-1 || v[i][j+k]<v[i-1][k]+(t-j*a[i])/b[i]){
                            v[i][j+k]=v[i-1][k]+(t-j*a[i])/b[i];
                            d[i][j+k]=j;
                        }
                    }
                }
            }
        }

        if(v[n][l]>=l)
            dr=t-1;
        else
            st=t+1;
    }

    for(i=1;i<=n;i++)
        for(j=0;j<=l;j++)
            v[i][j]=-1;

    for(j=0;j<=min(st/a[1],l);j++){
        v[1][j]=(st-j*a[1])/b[1];
        d[1][j]=j;
    }

    for(i=2;i<=n;i++){
        for(j=0;j<=min(st/a[i],l);j++){

            for(k=0;k+j<=l;k++){
                if(v[i-1][k]!=-1){
                    if(v[i][j+k]==-1 || v[i][j+k]<v[i-1][k]+(st-j*a[i])/b[i]){
                        v[i][j+k]=v[i-1][k]+(st-j*a[i])/b[i];
                        d[i][j+k]=j;
                    }
                }
            }
        }
    }

    fout<<st<<"\n";
    afis(n,l);

    return 0;
}