Cod sursa(job #2208018)

Utilizator georgitTreista Georgiana georgit Data 27 mai 2018 21:55:37
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#define MIN -1000000000

using namespace std;
int n,L,a[105],b[105],dp[105][105];
pair <int, int> sol[105];
bool verif(int t)
{
    for(int i=0;i<=n;i++)
        for(int j=1;j<=L;j++)
            dp[i][j]=MIN;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=L;j++)
            for(int laptea=0;laptea<=t/a[i] and laptea<=j;laptea++)
            {
               int lapteb=(t-a[i]*laptea)/b[i];
               dp[i][j]=max(dp[i][j],dp[i-1][j-laptea]+lapteb);
            }
    return (dp[n][L]>=L);
}
int main()
{
    ifstream f("lapte.in");
    ofstream g("lapte.out");
    f>>n>>L;
    for(int i=1;i<=n;i++)
        f>>a[i]>>b[i];
    int timp;
    for(int t=1;t<=100;t++)
        if(verif(t))
        {
            timp=t;
            break;
        }
    g<<timp<<"\n";
    verif(timp);
    for(int i=n;i>=1;i--)
        for(int laptea=0;laptea<=timp/a[i];laptea++)
        {
           int lapteb=(timp-a[i]*laptea)/b[i];
           if(dp[i][L]==dp[i-1][L-laptea]+lapteb)
           {
               sol[i].first=laptea;
               sol[i].second=lapteb;
               L-=laptea;
               break;
           }
        }
    for(int i=1;i<=n;i++)
        g<<sol[i].first<<" "<<sol[i].second<<"\n";

    return 0;
}