Cod sursa(job #518544)

Utilizator darrenRares Buhai darren Data 1 ianuarie 2011 17:45:11
Problema Ghiozdan Scor 74
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstring>
#include <fstream>
#include <vector>

using namespace std;

int N, G;
int V[20010], Minob[75002];
int Tnow[75002];
int sol[20010];
int Gmax, Nmin;

int main()
{
	ifstream fin("ghiozdan.in");
	ofstream fout("ghiozdan.out");

    fin >> N >> G;
    for (int i = 1; i <= N; ++i)
        fin >> V[i];
    memset(Minob, -1, sizeof(Minob));

    Minob[0] = 0;
    for (int i = 1; i <= N; ++i)
    {
        for (int j = G - V[i]; j >= 0; --j)
            if (Minob[j] != -1 && (Minob[j] + 1 < Minob[j + V[i]] || Minob[j + V[i]] == -1))
            {
                Minob[j + V[i]] = Minob[j] + 1;
                Tnow[j + V[i]] = j;

                if (j + V[i] >= Gmax)
                {
                    Gmax = j + V[i], Nmin = Minob[j + V[i]];

                    sol[0] = 1;
                    sol[1] = V[i];

                    int now = j;
                    while (now != 0)
                    {
                        sol[++sol[0]] = now - Tnow[now];
                        now = Tnow[now];
                    }
                }
            }
    }

    fout << Gmax << ' ' << Nmin << '\n';
    for (int i = 1; i <= sol[0]; ++i)
        fout << sol[i] << '\n';

	fin.close();
	fout.close();
}