Cod sursa(job #594294)

Utilizator SpiderManSimoiu Robert SpiderMan Data 6 iunie 2011 22:19:21
Problema Ghiozdan Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.09 kb
# include <cstdio>

const char *FIN = "ghiozdan.in", *FOU = "ghiozdan.out" ;
const int MAX_N = 75015, MAX_G = 215 ;

int cnt[MAX_G], poz[MAX_N], SOL[MAX_N] = {1} ;
int N, G, max, gmax;

inline int maxim (int A, int B) {
    return (A > B ? A : B) ;
}

int main (void) {
    freopen (FIN, "r", stdin) ;
    freopen (FOU, "w", stdout) ;

    scanf ("%d %d", &N, &G) ;
    for (int i = 1, X; i <= N; ++i) {
        scanf ("%d", &X) ;
        ++cnt[X], max = maxim (max, X);
    }
    for (int i = max; i ; --i) {
        if (cnt[i]) { continue ;
            for (int j = G - i; j + 1; --j) {
                if (SOL[j]) {
                    for (int k = 1; k <= cnt[i] && j + i * k <= G && SOL[j + i * k] == 0; ++k) {
                        SOL[j + i * k] = 1 + SOL[j + i * (k - 1)];
                        poz[j + i * k] = i;
                        gmax = maxim (gmax, j + i * k) ;
                    }
                }
            }
        }
    }
    printf ("%d %d\n", gmax, --SOL[gmax]) ;
    for (int i = gmax; i ; i -= poz[i])
        printf ("%d\n", poz[i]) ;
}