Cod sursa(job #1329080)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 29 ianuarie 2015 00:20:53
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#define nmax 105
#define inf 0x3f3f3f3f
using namespace std;

ifstream f("lapte.in");
ofstream g("lapte.out");

int n,d[nmax][nmax];
int a[nmax],b[nmax],l,solmin,t[nmax][nmax];

void drum(int n,int l){
    if(n==0)
        return;
    drum(n-1,l-t[n][l]);
    g<<t[n][l]<<" "<<(solmin-a[n]*t[n][l])/b[n]<<"\n";
}
int ok(int x){

    int i,j,timp,nra,nrb;
    for(i=0;i<=n;i++){
        for(j=0;j<=l;j++)
            d[i][j]=-inf;
        d[i][0]=0;
    }

    for(i=1;i<=n;i++){
        timp=x/a[i];

        for(nra=0;nra<=timp;nra++){

            nrb=(x-nra*a[i])/b[i];
            for(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(){

    int i;
    f>>n>>l;
    for(int i=1;i<=n;i++)
        f>>a[i]>>b[i];

    int p=1,u=nmax;
    while(p<=u){
        int m=(p+u)/2;
        if(ok(m)){
            solmin=m;
            u=m-1;
        }
        else
            p=m+1;
    }
    g<<solmin<<"\n";
    ok(solmin);
    drum(n,l);

    return 0;
}