Cod sursa(job #2647682)

Utilizator stefanvoicaVoica Stefan stefanvoica Data 5 septembrie 2020 18:43:02
Problema Lapte Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("lapte.in");
ofstream fout("lapte.out");
int n,l,dp[102][102],costla[102],costlb[102],ant[102][102];

bool sol (int timp)
{
    int i,latotal,la,lb;
    for (i=0; i<=n; i++)
        for (latotal=0; latotal<=l; latotal++)
            dp[i][latotal]=-1;
    dp[0][0]=0;
    for (i=1; i<=n; i++)
        for (latotal=0; latotal<=l; latotal++)
            if (dp[i-1][latotal]!=-1)
            {
                for (la=0; la<=min(l,timp/costla[i]); la++)
                {
                    lb=(timp-costla[i]*la)/costlb[i];
                    dp[i][min(latotal+la,l)]=max(dp[i][min(latotal+la,l)],dp[i-1][latotal]+lb);
                }
            }
    if (dp[n][l]>=l)
        return 1;
    return 0;
}

void afis(int i,int latotal)
{
    if(i>=1)
    {
        afis(i-1,ant[i][latotal]);
        fout<<latotal-ant[i][latotal]<<" "<<dp[i][latotal]-dp[i-1][ant[i][latotal]]<<'\n';
    }
}

void reconstituie (int timp)
{
    int i,latotal,la,lb;
    for (i=0; i<=n; i++)
        for (latotal=0; latotal<=l; latotal++)
            dp[i][latotal]=-1;
    dp[0][0]=0;
    for (i=1; i<=n; i++)
        for (latotal=0; latotal<=l; latotal++)
            if (dp[i-1][latotal]!=-1)
            {
                for (la=0; la<=min(l,timp/costla[i]); la++)
                {
                    lb=(timp-costla[i]*la)/costlb[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);
}

int main()
{
    fin>>n>>l;
    int st=1,dr=100,last=0,i;
    for (i=1; i<=n; ++i)
        fin>>costla[i]>>costlb[i];
    while (st<=dr)
    {
        int mij=(st+dr)/2;
        if (sol (mij))
        {
            last=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    fout<<last<<'\n';
    reconstituie(last);
    return 0;
}