Cod sursa(job #3265823)

Utilizator robertcosacCosac Robert-Mihai robertcosac Data 3 ianuarie 2025 16:16:46
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
using namespace std;
ifstream f("lapte.in");
ofstream g("lapte.out");
int dp[109][109], cost1[109], cost2[109], ant[109][109];

void afis (int n, int l)
{
    if (n>=1)
    {
        afis (n-1, ant[n][l]);
        g << l-ant[n][l] << ' ' << dp[n][l]-dp[n-1][ant[n][l]]<<'\n';
    }
}
int main ()
{
    int n, l;
    f >> n >> l;
    for (int i=1; i<=n; i++)
        f >> cost1[i] >> cost2[i];
    int st=1, dr=1e4, retine=0;
    while (st<=dr)
    {
        int t=(st+dr)/2;
        for (int i=0; i<=n; i++)
            for (int j=0; j<=l; j++)
                dp[i][j]=-1;
        dp[0][0]=0;
        for (int i=1; i<=n; i++)
        {
            for (int latotal=0; latotal<=l; latotal++)
            {
                if (dp[i-1][latotal]!=-1)
                {
                    for (int la=0; la<=min(l, t/cost1[i]); la++)
                    {
                        int lb=(t-cost1[i]*la)/cost2[i];
                        dp[i][min(latotal+la,l)]=max(dp[i][min(latotal+la,l)],dp[i-1][latotal]+lb);
                    }
                }
            }
        }
        if (dp[n][l]>=l)
        {
            retine=t;
            dr=t-1;
        }
        else st=t+1;
    }
    g << retine <<'\n';
    for (int i=0; i<=n; i++)
        for (int j=0; j<=l; j++)
            dp[i][j]=-1;
    dp[0][0]=0;
    int t=retine;
    for (int i=1; i<=n; i++)
    {
        for (int latotal=0; latotal<=l; latotal++)
        {
            if (dp[i-1][latotal]!=-1)
            {
                for (int la=0; la<=min(l, t/cost1[i]); la++)
                {
                    int lb=(t-cost1[i]*la)/cost2[i];
                    if (dp[i][min(latotal+la, l)]<dp[i-1][latotal]+lb)
                    {
                        dp[i][min(latotal+la, l)]=dp[i-1][latotal]+lb;
                        ant[i][min(latotal+la, l)]=latotal;

                    }
                }
            }
        }
    }
    afis(n,l);
}