Cod sursa(job #2428818)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 6 iunie 2019 16:51:56
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("lapte.in");
ofstream out("lapte.out");
const int N = 105;
int n, g, i, st, dr, mid;
int a[N], b[N];
int dp[N][N], t[N][N];
bool check (int p)
{
    int i, j, k;
    bool ok = false;
    for (i=1; i<=n; i++)
    {
        for (j=0; j<=g; j++)
        {
            dp[i][j] = -1;
        }
    }
    for (j=0; j<=min(g, p/a[1]); j++)
    {
        dp[1][j] = (p-a[1]*j)/b[1];
        t[1][j] = j;
    }
    for (i=2; i<=n; i++)
    {
        for (j=0; j<=min(g, p/a[i]); j++)
        {
            for (k=0; k<=g-j; k++)
            {
                if (dp[i-1][k] != -1)
                {
                    if (dp[i][k+j] < dp[i-1][k] + (p-a[i]*j)/b[i])
                    {
                        dp[i][k+j] = dp[i-1][k] + (p-a[i]*j)/b[i];
                        t[i][k+j] = j;
                        if (k + j == g && dp[i][k+j] >= g)
                        {
                            ok = true;
                        }
                    }
                }
            }
        }
    }
    return ok;
}

void path(int n, int g)
{
    if (n > 0)
    {
        path (n-1, g - t[n][g]);
        out << t[n][g] << " " << (st - t[n][g]*a[n])/b[n] << "\n";
    }
}

int main()
{
    in >> n >> g;
    for (i=1; i<=n; i++)
    {
        in >> a[i] >> b[i];
    }
    st = 1, dr = g*(a[1] + b[1]);
    while (st <= dr)
    {
        mid = st + (dr - st)/2;
        if (check (mid))
        {
            dr = mid - 1;
        }
        else
        {
            st = mid + 1;
        }
    }
    out << st << "\n";
    check (st);
    path (n, g);
    return 0;
}