Cod sursa(job #3293383)

Utilizator Andrei1209Andrei Mircea Andrei1209 Data 11 aprilie 2025 16:40:54
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n, l;
vector <vector <int>> dp;
vector <vector <int>> reza(105,vector<int>(105));
vector <pair <int,int>> c(105);
pair <int, int> solution[105];
/// dp[i][j] - cantitatea maxima de lapte 2 pe care o beau primii i copii, a.i sa bea SIGUR j litri de lapte 1
bool ok(int mij){
    dp.assign(n+1,vector <int>(l+1,-1));
    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*c[i].first<=mij;k++)
                if(dp[i-1][j-k]>=0){
                    int nd=dp[i-1][j-k]+(mij-k*c[i].first)/c[i].second;
                    if(nd>dp[i][j]){
                        dp[i][j]=nd;
                        reza[i][j]=k;
                    }
                }
    return dp[n][l]>=l;
}
void afis()
{
    for ( int i = 1; i <= n; ++i, fout << endl )
        for ( int j = 1; j <= l; ++j )
            fout << dp[i][j] << " ";
}
int main()
{
    fin >> n >> l;
    int i;
    for ( i = 1; i <= n; ++i )
        fin >> c[i].first >> c[i].second;

    int st = 1, dr = 1000005, mij, sol = -1;
    while ( st <= dr )
    {
        mij = (st + dr) / 2;
        if ( ok(mij) == true )
        {
            sol = mij;
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    fout << sol << '\n';
    bool ceva = ok(sol);
   // afis();
   // fout << "----------------------------------------\n";
    int s = l;
    for ( i = n; i >= 1; --i )
    {
        solution[i] = {reza[i][s], (sol - reza[i][s] * c[i].first)/c[i].second};
        s -= reza[i][s];
    }
    //fout << "-----------------------\n";
    for ( i = 1; i <= n; ++i )
        fout << solution[i].first << " " << solution[i].second << "\n";
    return 0;
}