Cod sursa(job #2762249)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 6 iulie 2021 10:18:50
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
typedef pair<int,int> pii;
int n,l,minim=1000,dp[105][105];
pii v[105],sol[105];
bool ok(int timp)
{
    dp[0][0]=0;
    for(int i=1;i<=l;i++)
        dp[0][i]=-1000;
    for(int i=1;i<=n;i++)
        for(int a=0;a<=l;a++)
        {
            dp[i][a]=-1000;
            for(int nrA=0;nrA<=min(a,timp/v[i].first);nrA++)
            {
                int nrB=(timp-v[i].first*nrA)/v[i].second;
                dp[i][a]=max(dp[i][a],nrB+dp[i-1][a-nrA]);
            }
        }
    return dp[n][l]>=l;
}
int main()
{
    fin>>n>>l;
    for(int i=1;i<=n;i++)
        fin>>v[i].first>>v[i].second;
    int st=1;
    int dr=100;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(ok(mij))
        {
            minim=min(minim,mij);
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    fout<<minim<<'\n';
    ok(minim);
    int Aleft=l;
    int Bleft=l;
    for(int i=n;i>=1;i--)
    {
        for(int nrA=0;nrA<=min(Aleft,minim/v[i].first);nrA++)
        {
            int nrB=(minim-v[i].first*nrA)/v[i].second;
            if(dp[i-1][Aleft-nrA]>=Bleft-nrB)
            {
                sol[i]={nrA,nrB};
                Aleft-=nrA;
                Bleft-=nrB;
                break;
            }
        }
    }
    for(int i=1;i<=n;i++)
        fout<<sol[i].first<<" "<<sol[i].second<<'\n';
    return 0;
}