Cod sursa(job #2526971)

Utilizator betybety bety bety Data 19 ianuarie 2020 13:38:22
Problema Ghiozdan Scor 54
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#define inf 30000
using namespace std;
ifstream cin("ghiozdan.in");
ofstream cout("ghiozdan.out");
int v[20005],dp[75005],last[75005],sol[75005];
int main()
{
    int n,g,gmax=-1,next=-1;
    cin>>n>>g;
    for(int i=1;i<=n;++i)
        cin>>v[i];
    for(int j=1;j<=g;++j)
        dp[j]=inf;
    for(int i=1;i<=n;++i)
    {
        for(int j=g-1;j>=0;--j)
        if(dp[j]!=inf and j+v[i]<=g)
        {
            if(j+v[i]>gmax)
            {
                gmax=j+v[i];
                dp[j+v[i]]=dp[j]+1;
                sol[gmax]=v[i];
                last[gmax]=v[i];
                next=j;
                sol[next]=last[next];
                next=j-last[next];
            }
            else if(j+v[i]==gmax and dp[j+v[i]]>dp[j]+1)
            {
                gmax=j+v[i];
                dp[j+v[i]]=dp[j]+1;
                sol[gmax]=v[i];
                last[gmax]=v[i];
                next=j;
                sol[next]=last[next];
                next=j-last[next];
            }
            else if(j!=next)
            {
                if(dp[j+v[i]]>dp[j]+1)
                    dp[j+v[i]]=dp[j]+1,last[j+v[i]]=v[i];
            }
            else if(j==next)
            {
                if(dp[j+v[i]]>dp[j]+1)
                    dp[j+v[i]]=dp[j]+1,last[j+v[i]]=v[i];
                sol[next]=last[next];
                next=j-last[next];
            }
        }
    }
    cout<<gmax<<" "<<dp[gmax]<<endl;
    int nr=dp[gmax];
    for(int i=1;i<=nr;++i)
    {
        cout<<sol[gmax]<<endl;
        gmax=gmax-sol[gmax];
    }
    return 0;
}