Cod sursa(job #1359119)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 24 februarie 2015 21:20:54
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include<fstream>
using namespace std;
int n, p, u, mid, i, j, k, L, bl;
int a[101], b[101], d[101][101];
pair<int, int> t[101][101];
ifstream fin("lapte.in");
ofstream fout("lapte.out");
void drum(int i, int j){
    if(i != 0){
        drum(i - 1, j - t[i][j].first);
        fout<< t[i][j].first <<" "<< t[i][j].second <<"\n";
    }
}
int verif(int t){
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= L; j++){
            d[i][j] = -1000000000;
        }
    }
    d[0][0] = 0;
    for(int i = 1; i <= n; i++){
        for(int k = 0; k <= t / a[i]; k++){
            for(int j = k; j <= L; j++){
                int bl = (t - a[i] * k) / b[i];
                d[i][j] = max(d[i][j], bl + d[i-1][j-k]);
            }
        }
    }
    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];
    }
    p = 1;
    u = L * a[1] + L * b[1];
    while(p <= u){
        mid = (p + u) / 2;
        if(verif(mid)){
            u = mid - 1;
        }
        else{
            p = mid + 1;
        }
    }
    fout<< p <<"\n";
    
	for(int i = 0; i <= n; i++){
        for(int j = 0; j <= L; j++){
            d[i][j] = -1000000000;
        }
    }
    d[0][0] = 0;
    for(i = 1; i <= n; i++){
        for(k = 0; k <= p / a[i]; k++){
            for(j = k; j <= L; j++){
                bl = (p - a[i] * k) / b[i];
				if(bl + d[i-1][j-k] > d[i][j]){
					d[i][j] = bl + d[i-1][j-k];
					t[i][j].first = k;
					t[i][j].second = bl;
				}
            }
        }
    }
    drum(n, L);
    return 0;
}