Cod sursa(job #3178935)

Utilizator FlofyA Programmer Flofy Data 2 decembrie 2023 18:23:18
Problema Ghiozdan Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>

using namespace std;

ifstream cin ("ghiozdan.in");
ofstream cout ("ghiozdan.out");

const int dim = 75002;

int dp[dim], g[dim], tata[dim], frecv[dim];

int main()
{
    int N, Gmax, i, j, g_actuala, nr_obiecte_posibile;

    cin >> N >> Gmax;

    for(i = 1; i <= N; i++)
        cin >> g[i], frecv[g[i]]++;

    dp[0] = 1;
    for(i = dim; i > 0; i--)
    {
        if(frecv[i] != 0)
        {
            for(g_actuala = Gmax; g_actuala >= 0; g_actuala--)
            {
                if(dp[g_actuala] != 0)
                {
                    nr_obiecte_posibile = min(frecv[i], (Gmax - g_actuala) / i);

                    for(j = 1; j <= nr_obiecte_posibile; j++)
                    {
                        if(dp[i * j + g_actuala] != 0)
                            break;

                        dp[i * j + g_actuala] = dp[g_actuala] + j;
                        tata[i * j + g_actuala] = i;
                    }
                }

            }
        }
    }

    i = Gmax;

    while(dp[i] == 0)
        i--;

    cout << i << " " << dp[i] - 1 << '\n';

    while(dp[i] - 1 > 0)
    {
        cout << tata[i] << '\n';

        i = i - tata[i];
    }

    return 0;
}