Cod sursa(job #1941385)

Utilizator ionutpop118Pop Ioan Cristian ionutpop118 Data 27 martie 2017 11:26:23
Problema Ghiozdan Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
using namespace std;
bool d[75005];
int last[75005], x[75005], ap[75005], f[200];
int main()
{
    freopen("ghiozdan.in", "r", stdin);
    freopen("ghiozdan.out", "w", stdout);

    int n, g, poz, nr;
    scanf("%d %d", &n, &g);
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &nr);
        ++f[nr];
    }
    d[0] = 1;
    for (int i = 200; i > 0; --i)
        for (int j = g - i; j >= 0; --j)
            if (d[j] == 1)
                for (int k = 1; j + i * k <= g && k <= f[i] && !d[j + k * i]; ++k)
                    //if (d[j + i * k] == 0)
                    {
                        poz = j + k * i;
                        d[poz] = 1;
                        ap[poz] = ap[j] + k;
                        last[poz] = j;
                        x[poz] = i;
                    }
    for (int i = g; i > 0; --i)
        if(d[i] == 1)
        {
            printf("%d %d\n", i, ap[i]);
            while (i > 0)
            {
                nr = ap[i] - ap[last[i]];
                for (int j = 1; j <= nr; ++j)
                    printf("%d\n", x[i]);
                i = last[i];
            }
        }
    return 0;
}