Cod sursa(job #3372128)

Utilizator Floroiu_MariusFloroiu Marius Cristian Floroiu_Marius Data 2 noiembrie 2026 15:46:23
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("lapte.in");
ofstream fout("lapte.out");
int n,l;
struct da
{
    int a,b;
}v[103];
int dp[203];
bool cautb(int x)
{
    for (int i=1;i<=2*l;i++)
        dp[i]=-1;
    dp[0]=0;
    for (int i=1;i<=n;i++)
    {
        //alegem cat lapteA a baut deja
        for (int lapteA=2*l;lapteA>=0;lapteA--)
        {
            //alegem cat lapte sa mai bea
            int Max=min(x/v[i].a,lapteA);
            for (int j=0;j<=Max;j++)
            {
                if (dp[lapteA-j]==-1) continue;
                int lapteB=(x-j*v[i].a)/v[i].b;
                dp[lapteA]=max(dp[lapteA],dp[lapteA-j]+lapteB);
            }
        }
    }
    for (int i=l;i<=2*l;i++)
        if (dp[i]>=l) return 1;
    return 0;
}
int dpf[103][203];
da rez[103];
int main()
{
    fin>>n>>l;
    for (int i=1;i<=n;i++)
        fin>>v[i].a>>v[i].b;
    int st=0,dr=100,x=0;
    while (st<=dr)
    {
        int mij=((st+dr)>>1);
        if (cautb(mij)) dr=mij-1,x=mij;
        else st=mij+1;
    }
    fout<<x<<'\n';
    for (int j=0;j<=n;j++)
        for (int i=1;i<=2*l;i++)
            dpf[j][i]=-1;
    dpf[0][0]=0;
    for (int i=1;i<=n;i++)
    {
        //alegem cat lapteA a baut deja
        for (int lapteA=2*l;lapteA>=0;lapteA--)
        {
            //alegem cat lapte sa mai bea
            int Max=min(x/v[i].a,lapteA);
            for (int j=0;j<=Max;j++)
            {
                if (dpf[i-1][lapteA-j]==-1) continue;
                int lapteB=(x-j*v[i].a)/v[i].b;
                dpf[i][lapteA]=max(dpf[i][lapteA],dpf[i-1][lapteA-j]+lapteB);
            }
        }
    }
    int solA=0,solB=0;
    for (int i=l;i<=2*l && solA==0;i++)
        if (dpf[n][i]>=l) solA=i,solB=dpf[n][i];
    for (int i=n;i>=1;i--)
    {
        int Max=min(x/v[i].a,solA);
        for (int j=0;j<=Max;j++)
        {
            if (dpf[i-1][solA-j]==-1) continue;
            int lapteB=(x-j*v[i].a)/v[i].b;
            if (dpf[i][solA]==dpf[i-1][solA-j]+lapteB)
            {
                solA-=j;
                solB-=lapteB;
                rez[i]={j,lapteB};
                break;
            }
        }
    }
    for (int i=1;i<=n;i++)
        fout<<rez[i].a<<" "<<rez[i].b<<'\n';
    return 0;
}