Cod sursa(job #2631361)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 30 iunie 2020 10:28:33
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 100;
int n, l, dp[nmax + 5][nmax + 5];

struct bautorDeLapte
{
    int a, b;
}v[nmax + 5], sol[nmax + 5][nmax + 5];



bool Pot(int mid)
{
    for (int i = 0; i <= n; ++i)
    {
        for (int j = 0; j <= l; ++j)
        {
            dp[i][j] = -(1 << 30);
        }
    }
    dp[0][0] = 0;
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 0; j <= l; ++j)
        {
            for (int k = 0; k * v[i].a <= mid && k <= j; ++k)
            {
                int timp = mid - (k * v[i].a);
                int k2 = timp / v[i].b;
                if (dp[i - 1][j - k] + k2 > dp[i][j])
                {
                    dp[i][j] = dp[i - 1][j - k] + k2;
                    sol[i][j] = {k, k2};
                }
            }
        }
    }
    return dp[n][l] >= l;
}

void reconst(int i, int j)
{
    if (i == 1)
    {
        fout << sol[i][j].a << " " << sol[i][j].b << "\n";
        return;
    }
    reconst(i - 1, j - sol[i][j].a);
    fout << sol[i][j].a << " " << sol[i][j].b << "\n";
}

int main()
{
    fin >> n >> l;
    for (int i = 1; i <= n; ++i)
    {
        fin >> v[i].a >> v[i].b;
    }
    int st = 1, dr = 100 * 100, ans = -1;
    while (st <= dr)
    {
        int mid = (st + dr) / 2;
        if (Pot(mid))
        {
            ans = mid;
            dr = mid - 1;
        }
        else
        {
            st = mid + 1;
        }
    }
    fout << ans << "\n";
    Pot(ans);
    reconst(n, l);
    fin.close();
    fout.close();
    return 0;
}