Cod sursa(job #1367986)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 2 martie 2015 12:38:33
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <fstream>
#define DIM 105
#define INF 0x3f3f3f3f

using namespace std;

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

int N,L,A[DIM],B[DIM],p,u,mid,D[DIM][DIM],T[DIM][DIM],sol;
int ok(int x){
    for(int i=0;i<=N;i++){
        for(int j=0;j<=L;j++)
            D[i][j]=-INF;
        D[i][0]=0;
    }
    for(int i=1;i<=N;i++){
        int a=x/A[i];
        for(int d=0;d<=a;d++){
            int b=(x-d*A[i])/B[i];
            for(int j=L;j>=d;j--)
                if(D[i][j]<D[i-1][j-d]+b){
                    D[i][j]=D[i-1][j-d]+b;
                    T[i][j]=d;
                }
        }
    }
    return D[N][L]>=L;
}
void drum(int x,int y){
   if(x>1)
        drum(x-1,y-T[x][y]);
   fout<<y<<" "<<D[x][y]-D[x-1][y-T[x][y]]<<"\n";
}
int main(){
    fin>>N>>L;
    for(int i=1;i<=N;i++)
        fin>>A[i]>>B[i];
    p=1;
    u=100;
    while(p<=u){
        mid=(p+u)>>1;
        if(ok(mid)){
            sol=mid;
            u=mid-1;
        }
        else
            p=mid+1;
    }
    fout<<sol<<"\n";
    ok(sol);
    drum(N,L);
    fin.close();fout.close();
    return 0;
}