Cod sursa(job #974164)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 16 iulie 2013 15:54:07
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.13 kb
#include <fstream>

#define In "ghiozdan.in"
#define Out "ghiozdan.out"
#define Gmax 75002
#define max(a,b) ((a)>(b)?(a):(b))

using namespace std;

int G, N, MaxG, Last[Gmax], Sol[Gmax],f[202], val_max;

inline void Read()
{
    ifstream in(In);
    in>>N>>G;
    int x;
    for(int i = 1;i <= N;++i)
    {
        in>>x;
        ++f[x];
        val_max = max(x,val_max);
    }
    in.close();
}

inline void Solve()
{
    int i, j, k, x;
    Sol[0] = 1;
    for(i = val_max;i ; --i)
        if(f[i])
            for(j = G-i;j >= 0; --j)
                if(Sol[j])
                    for(k = 1,x = i;k<=f[i] && j+x<=G && !Sol[j+x]; ++k,x+=i)
                    {
                        Sol[j+x] = Sol[j]+k;
                        Last[j+x] = i;
                        if(j+x>MaxG)
                            MaxG = j+x;
                    }
}

inline void Write()
{
    ofstream g(Out);
    g<<MaxG<<" "<<Sol[MaxG]-1<<"\n";
    while(MaxG)
    {
        g<<Last[MaxG]<<"\n";
        MaxG-=Last[MaxG];
    }
    g.close();
}

int main()
{
    Read();
    Solve();
    Write();
    return 0;
}