Cod sursa(job #1174426)

Utilizator mvcl3Marian Iacob mvcl3 Data 22 aprilie 2014 19:44:11
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include  <fstream>
#include  <vector>

#define in "ghiozdan.in"
#define out "ghiozdan.out"

class Ghiozdan
{
    protected :
        int N, G;
        std :: vector < int > HowMuch, Parent, Mark, DP;

    public :
        void Read_Input()   {
            std :: ifstream f(in);
            f >> N >> G;

            HowMuch.resize(201), Parent.resize(G + 1), Mark.resize(G + 1);

            for(int i = 1, val; i <= N; ++i) f >> val, HowMuch[val] ++;

            f.close();
        }

        void Solve()    {
            Mark[0] = 1;
            for(int i = 200; i >= 1; --i)
                for(int j = G - i; j >= 0 && HowMuch[i]; --j)
                    for(int t = 1; Mark[j] && t <= HowMuch[i] && t * i + j <= G && !Mark[t * i + j]; ++t)  {
                        Mark[t * i + j] = Mark[j] + t;
                        Parent[t * i + j] = i;
                    }
        }

        void Write_Output() {
            int ans;
            std :: ofstream g(out);

            for(ans = G; !Mark[ans]; ans--);

            g << ans << ' ' << Mark[ans] - 1 << '\n';
            while(ans != Parent[ans] && ans >= 0)  {
                g << Parent[ans] << '\n';
                ans -= Parent[ans];
            }
            g << Parent[ans] << '\n';

            g.close();
        }
} my_obj;

int main()
{
    my_obj.Read_Input();
    my_obj.Solve();
    my_obj.Write_Output();

    return 0;
}