Cod sursa(job #2064418)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 12 noiembrie 2017 12:32:47
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#define INF 100000000

using namespace std;

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

int n,l,i,j,a[101],b[101],sola[101],solb[101],d[101][101],k;
int st,dr,mid;

int main()
{
    fin >> n >> l;
    for (i=1; i<=n; i++)
        fin >> a[i] >> b[i];
    st = 1;
    dr = 100000;
    while (st <= dr)
    {
        mid = (st+dr)/2;
        for (i=0; i<=n; i++)
            for (j=0; j<=l; j++)
                d[i][j] = -INF;
        d[0][0] = 0;
        for (i=1; i<=n; i++)
            for (j=0; j<=l; j++)
                for (k=0; k<=min(j, mid/a[i]); k++)
                    d[i][j] = max(d[i][j], d[i-1][j-k]+(mid-a[i]*k)/b[i]);
        if (d[n][l] < l)
            st = mid+1;
        else
            dr = mid-1;
    }
    fout << st << "\n";
    for (i=0; i<=n; i++)
        for (j=0; j<=l; j++)
            d[i][j] = -INF;
    d[0][0] = 0;
    for (i=1; i<=n; i++)
        for (j=0; j<=l; j++)
            for (k=0; k<=min(j, st/a[i]); k++)
                d[i][j] = max(d[i][j], d[i-1][j-k]+(st-a[i]*k)/b[i]);
    j = l;
    for (i=n; i>=1; i--)
        for (k=0; k<=min(j, st/a[i]); k++)
            if (d[i-1][j-k]+(st-a[i]*k)/b[i] == d[i][j])
            {
                sola[i] = k;
                solb[i] = (st-a[i]*k)/b[i];
                j -= k;
                break;
            }
    for (i=1; i<=n; i++)
        fout << sola[i] << " " << solb[i] << "\n";
    return 0;
}