Cod sursa(job #2432420)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 23 iunie 2019 16:51:32
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 107;
const int INF = 1e5;

int a[DIM];
int b[DIM];

int dp[DIM][DIM];
int from[DIM][DIM];

int n, l;
bool check(int timp)
{
    for(int i = 0; i <= n; i++)
        for(int j = 0; j <= l; j++)
            dp[i][j] = -INF;

    dp[0][0] = 0;

    for(int i = 1; i <= n; i++)
        for(int j = 0; j <= l && j * a[i] <= timp; j++)
            for(int p = 0; j + p <= l; p++)
                if(dp[i][j + p] < dp[i - 1][p] + (timp - j * a[i]) / b[i])
                {
                    dp[i][j + p] = dp[i - 1][p] + (timp - j * a[i]) / b[i];
                    from[i][j + p] = j;
                }
    return (dp[n][l] >= l);
}

int ans;

void afiseaza(int n, int l)
{
    int x = from[n][l];
    int y = (ans - x * a[n]) / b[n];

    if(n != 1)
    {
        afiseaza(n - 1, l - x);
    }

    out << x << ' ' << y << '\n';
}

int main()
{
    in >> n >> l;

    for(int i = 1; i <= n; i++)
        in >> a[i] >> b[i];

    int st = 1;
    int dr = 100;

    while(st <= dr)
    {
        int mid = (st + dr) / 2;

        if(check(mid))
        {
            dr = mid - 1;
            ans = mid;
        }
        else
        {
            st = mid + 1;
        }
    }

    check(ans);

    out << ans << '\n';

    afiseaza(n, l);
}