Cod sursa(job #3133165)

Utilizator Vladgiuscavladgiusca Vladgiusca Data 25 mai 2023 11:16:47
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>

using namespace std;

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

const int max_size = 1e2 + 5, INF = 1e9;

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

bool check (int t)
{
    for (int i = 0; i <= n; i++)
    {
        for (int j = 0; j <= l; j++)
        {
            dp[i][j] = -INF;
            ans[i][j] = 0;
        }
    }
    dp[0][0] = 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] + (t - k * a[i]) / b[i];
                    ans[i][j] = k;
                }
            }
        }
    }
   // out << t << " " << dp[n][l] << '\n';
    if (dp[n][l] >= l)
    {
        return true;
    }
    return false;
}

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

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