Cod sursa(job #3183782)

Utilizator ana_valeriaAna Valeria Duguleanu ana_valeria Data 13 decembrie 2023 10:53:06
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#define MAX 100
#define INF 1000000000
using namespace std;
ifstream cin ("lapte.in");
ofstream cout ("lapte.out");
int a[MAX + 10], b[MAX + 10],dp[MAX + 10][MAX + 10], ans[MAX + 10][MAX + 10], n, l;
int ok(int time)
{
    for (int i = 0; i <= MAX; i++)
        for (int j = 0; j <= MAX; j++)
            dp[i][j] = -INF;
    dp[0][0] = 0;
    for (int i = 1; i <= n; i++)
        for (int lA = 0; lA <= time / a[i]; lA++)
            for (int drankA = 0; drankA <= l - lA; drankA++)
            {
                int lB = (time - lA * a[i]) / b[i];
                if (dp[i][drankA + lA] < dp[i - 1][drankA] + lB)
                {
                    dp[i][drankA + lA] = dp[i - 1][drankA] + lB;
                    ans[i][drankA + lA] = lA;
                }
            }
    if (dp[n][l] >= l)
        return 1;
    return 0;
}
void print(int n, int l)
{
    if (n != 0)
    {
        print(n - 1, l - ans[n][l]);
        cout << ans[n][l] << ' ' << dp[n][l] - dp[n - 1][l - ans[n][l]] << '\n';
    }
}
int main()
{
    cin >> n >> l;
    for (int i = 1; i <= n; i++)
        cin >> a[i] >> b[i];
    int left = 1, right = MAX, time = 1;
    while (left <= right)
    {
        int mid = (left + right) / 2;
        if (ok(mid) == 1)
        {
            right = mid - 1;
            time = mid;
        }
        else
            left = mid + 1;
    }
    cout << time << '\n';
    ok(time);
    print(n, l);
    return 0;
}