Cod sursa(job #1310252)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 6 ianuarie 2015 16:59:18
Problema Lapte Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int NMAX = 100;
const int INFINIT = (1 << 30);

struct lapte{
    int a,b;
};
lapte v[NMAX + 10];
int dp[NMAX + 10][NMAX + 10],sol[NMAX + 10][NMAX + 10],n,l,tmin;

void read()
{

    in>>n>>l;
    for(int i = 1 ; i <= n ; i++)
        in>>v[i].a>>v[i].b;
    in.close();

}

bool ok(int timp)
{

    for(int i = 0 ; i <= n ; i++){
        for(int j = 0 ; j <= l ; j++)
           dp[i][j] = -INFINIT;
        dp[i][0] = 0;
    }

    for(int i = 1 ; i <= n ; i++){
        int maxa = timp/v[i].a;
        for(int j = 0 ; j <= min(l,maxa) ; j++){
            int maxb = (timp-j*v[i].a)/v[i].b;
            for(int k = l ; k >= j ; k--)
                if(dp[i][k] < dp[i-1][k-j] + maxb){
                    dp[i][k] = dp[i-1][k-j] + maxb;
                    sol[i][k] = maxa;
                }
        }
    }
    return dp[n][l] >= l;
}

int solve()
{

    int left = 0,right = NMAX + 10,solutie = -1;
    while(left <= right){
        int mid = (left+right)>>1;
        if(ok(mid)){
            solutie = mid;
            right = mid - 1;
        }
        else
            left = mid + 1;
    }
    return solutie;
}

void afis(int poz,int litrii)
{

    if(!poz)
        return;
    afis(poz-1,litrii-sol[poz][litrii]);
    out<<sol[poz][litrii]<<" "<<(tmin-v[poz].a*sol[poz][litrii])/v[poz].b<<"\n";
}

int main()
{

    read();
    tmin = solve();
    ok(tmin);
    out<<tmin<<"\n";
    afis(n,l);
    return 0;
}