Cod sursa(job #235329)

Utilizator DastasIonescu Vlad Dastas Data 23 decembrie 2008 14:00:32
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#include <algorithm>

const int maxn = 20001;
const int maxg = 75001;
const int inf = 1 << 29;

FILE *in = fopen("ghiozdan.in","r"), *out = fopen("ghiozdan.out","w");

int n, g;
int nr[maxn], a[maxg], rec[maxg];

bool cmp(int x, int y)
{
    return x > y;
}

void readinit()
{
    fscanf(in, "%d %d", &n, &g);

    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &nr[i]);

    std::sort(nr+1, nr+n+1, cmp);

    for ( int i = 1; i <= g; ++i )
        a[i] = inf;
}

void go()
{
    int sum = 0;
    for ( int i = 1; i <= n && a[g] == inf; ++i )
    {
        sum += nr[i];
        sum > g ? sum = g : 0;

        for ( int j = sum; j >= nr[i]; --j )
            if ( a[j - nr[i]] + 1 < a[j] )
            {
                a[j] = a[j - nr[i]] + 1;
                rec[j] = nr[i];
            }
    }

    while ( a[g] == inf )
        --g;

    fprintf(out, "%d %d\n", g, a[g]);
    while ( g )
    {
        fprintf(out, "%d\n", rec[g]);
        g -= rec[g];
    }
}

int main()
{
    readinit();
    go();


    return 0;
}