Cod sursa(job #1926250)

Utilizator akaprosAna Kapros akapros Data 14 martie 2017 10:36:44
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>
#define maxN 20001
#define maxG 75001
#define maxW 201
using namespace std;

FILE *fin = freopen("ghiozdan.in", "r", stdin);
FILE *fout = freopen("ghiozdan.out", "w", stdout);

/* ------------- */
int n, g;
/* ------------- */
struct Dp
{
    int prv, nro, obj;
} dp[maxG + 1];
int t, frq[maxW + 1];
/* ------------- */
int gmax;

void read()
{
    scanf("%d %d", &n, &g);
    for (int i = 1; i <= n; ++ i)
    {
        int w;
        scanf("%d", &w);
        ++ frq[w];
    }
}

void init()
{
    dp[0].nro = 0; ///
    for (int i = 1; i < maxG; ++ i)
        dp[i] = {0, maxN, 0};
}

void solve()
{
    init();

    for (int i = maxW - 1; i >= 1; -- i)
        if (frq[i])
        {
            for(int j = g - i; j >= 0; -- j)
            {
                if (dp[j].nro != maxN)
                {
                    for (int k = 1; k <= frq[i] && j + k * i <= g && dp[j + k * i].nro == maxN; ++ k)
                    {
                        if (dp[j + k * i].nro > dp[j].nro + k)
                        {
                            dp[j + k * i].nro = dp[j].nro + k;
                            dp[j + k * i].obj = i;
                            dp[j + k * i].prv = j;
                        }
                        if (dp[j + k * i].nro != maxN && j + k * i > gmax)
                            gmax = j + k * i;
                    }
                }
            }
        }
}

void write()
{
    printf("%d %d\n", gmax, dp[gmax].nro);
    int G = gmax;
    while (G)
    {
        for (int i = 1; i <= (G - dp[G].prv) / dp[G].obj; ++ i)
            printf("%d\n", dp[G].obj);
        G = dp[G].prv;
    }
}

int main()
{
    read();
    solve();
    write();
    return 0;
}