Cod sursa(job #1827230)

Utilizator cordun_cristinaCristina Maria Cordun cordun_cristina Data 11 decembrie 2016 16:50:07
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>

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

const int Nmax = 105;
int n, l, a[Nmax], b[Nmax], DP[Nmax][Nmax], A[Nmax][Nmax], k;

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

void Print(int i, int j)
{
    if(i == 0) return;
    Print(i-1,j-A[i][j]);
    g<<A[i][j]<<' '<< (k-A[i][j]*a[i])/b[i]<<'\n';
}

void Init()
{
    for(int i = 0; i <= 100; i++)
        for(int j = 0; j <= 100; j++)
            DP[i][j] = -1000000000;
    DP[0][0] = 0;
}

void Solve()
{
    for(k = 1; k <= 100; k++)
    {
        Init();
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j <= l; j++)
            {
                for(int j2 = 0; j2 <= k/a[i] && j2<=j; j2++)
                {
                    if(DP[i][j] < DP[i-1][j-j2]+(k-j2*a[i])/b[i])
                    {
                        DP[i][j] = DP[i-1][j-j2]+(k-j2*a[i])/b[i];
                        A[i][j] = j2;
                    }
                }
            }
        }
        //cout<<DP[n][l];
        if(DP[n][l] >= l)
        {
            g<<k<<'\n';
            Print(n,l);
            return;
        }
    }
    //g<<k<<'\n';
    //Print(n,l);
}

int main()
{
    Read();
    Solve();
    return 0;
}