Cod sursa(job #2920657)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 25 august 2022 11:47:22
Problema Lapte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>

using namespace std;

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

const int max_size = 1e2 + 1;

long long dp[max_size][max_size], a[max_size], b[max_size], ans[max_size][max_size], n, l, sol;

bool check (int t)
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= l; j++)
        {
            dp[i][j] = 0;
            ans[i][j] = 0;
        }
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= l; j++)
        {
            for (int k = 0;k <= j && k * a[i] <= t; k++)
            {
                if (dp[i][j] < dp[i - 1][j - k] + (t - k * a[i]) / b[i])
                {
                    dp[i][j] = dp[i - 1][j - k];
                    dp[i][j] += (t - k * a[i]) / b[i];
                    ans[i][j] = k;
                }
            }
        }
    }
    if (dp[n][l] >= l)
    {
        return true;
    }
    return false;
}

void rez (int i, int j)
{
    if (i == 0)
    {
        return;
    }
    int x = ans[i][j], y = (sol - x * a[i]) / b[i];
    rez(i - 1, j - x);
    out << x << " " << y << '\n';
}

int main ()
{
    in >> n >> l;
    for (int i = 1; i <= n; i++)
    {
        in >> a[i] >> b[i];
    }
    int e = (1 << 14);
    for (int st = 0; e > 0; e >>= 1)
    {
        if (check(e + st))
        {
            sol = e + st;
        }
        else
        {
            st += e;
        }
    }
    out << sol << '\n';
    check(sol);
    rez(sol, l);
    in.close();
    out.close();
    return 0;
}