Cod sursa(job #94363)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 22 octombrie 2007 19:57:34
Problema Ghiozdan Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define GMAX 7502
#define NMAX 1002
#define INF 666000666

int N, G, A[NMAX][GMAX], V[NMAX], Nmax, Gmax, Vn[100][100][2];

int main()
{
        int i, g, j, k;

        freopen("ghiozdan.in", "r", stdin);
        scanf("%d%d", &N, &G);

        for (i = 0; i < N; i++) scanf("%d", V+i);

        sort(V,V+N);

        for (i = 0; i < N; i++)
            for (g = 1; g <= G; g++) A[i][g] = INF;

        i = 0;
        A[i][V[i]]=1; Gmax = V[i]; Nmax = 1;

        for (i = 1; i < N; i++)
        {
            for (g = 0; g <= G; g++) A[i][g] = A[i-1][g], Vn[i][g][0] = i-1, Vn[i][g][1] = Vn[i-1][g][1];
            for (g = V[i]; g <= G; g++)
                if (A[i][g]>(A[i-1][g-V[i]]+1)) A[i][g] = A[i-1][g-V[i]]+1, Vn[i][g][0] = i-1, Vn[i][g][1] = V[i];
            for (g = G; g > 0; g--)
                if (A[i][g]<INF) break;
            if ((Gmax<g)||((Gmax==g)&&(Nmax>A[i][g])))
               Gmax = g, Nmax = A[i][g], k = i;
        }

        freopen("ghiozdan.out", "w", stdout);
        printf("%d %d\n", Gmax, Nmax);

        g = Gmax;
        printf("%d\n", V[k]);
        while (Nmax)
        {
                j = g-Vn[k][g][1];
                k = Vn[k][g][0]; g = j;
                printf("%d\n", V[k]);
                Nmax--;
        }

        return 0;
        
}