Cod sursa(job #2875588)

Utilizator matei.tudoseMatei Tudose matei.tudose Data 21 martie 2022 22:58:23
Problema Lapte Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <fstream>
#include <cstring>
using namespace std;

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

struct petrecaret
{
    int sec_pt_1LA, sec_pt_1LB;
};

int n, lapte_min, dp[102][105], ans;
petrecaret rasp[102][105], pers[105];

bool dinamica(int timp)
{
    for (int i = 0; i <= n; i++)
        for (int j = 0; j <= lapte_min; j++)
            dp[i][j] = -100000000;
    dp[0][0] = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= lapte_min; j++)
        {
            for (int x = 0; x * pers[i].sec_pt_1LA < timp && x <= j; x++)
            {
                int lapteB = (timp - x * pers[i].sec_pt_1LA) / pers[i].sec_pt_1LB;
                if (dp[i][j] < dp[i - 1][j - x] + lapteB)
                {
                    dp[i][j] = dp[i - 1][j - x] + lapteB;
                    petrecaret it;
                    it.sec_pt_1LA = x;
                    it.sec_pt_1LB = lapteB;
                    rasp[i][j] = it;
                }
            }
        }
    }
    return dp[n][lapte_min] >= lapte_min;
}

void afis(int i, int j)
{
    if (i == 1)
    {
        fout << rasp[i][j].sec_pt_1LA << " " << rasp[i][j].sec_pt_1LB << "\n";
        return;
    }
    afis(i - 1, j - rasp[i][j].sec_pt_1LA);
    fout << rasp[i][j].sec_pt_1LA << " " << rasp[i][j].sec_pt_1LB << "\n";
}

int main()
{
    fin >> n >> lapte_min;
    for (int i = 1; i <= n; i++)
    {
        petrecaret pers_i;
        fin >> pers_i.sec_pt_1LA >> pers_i.sec_pt_1LB;
        pers[i] = pers_i;
    }
    int st = 1, dr = 100, mid;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (dinamica(mid))
        {
            ans = mid;
            dr = mid - 1;
        }
        else
            st = mid + 1;
        memset(rasp, 0, sizeof rasp);
    }
    fout << ans << "\n";
    dinamica(ans);
    afis(n, lapte_min);
    return 0;
}