Cod sursa(job #3334776)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 19 ianuarie 2026 19:46:18
Problema Ghiozdan Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;
const int inf = 1e9;
int n, g;
vector<int> dp, fr, par;
int main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    cin >> n >> g;
    fr.resize(200 + 5);
    dp.assign(g + 5, inf);
    par.resize(g + 5);
    int maxi = -1;
    for(int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        fr[x] ++;
        maxi = max(maxi, x);
    }
    dp[0] = 0;
    for(int i = maxi; i >= 1; i --)
    {
        int f = fr[i];
        int p = 1;
        if(f == 0)
            continue;
        while(f)
        {
            for(int j = g; j >= p * i; j --)
                if(dp[j] > dp[j - p * i] + p)
                {
                    dp[j] = dp[j - p * i] + p;
                    par[j] = j - i;
                }
            f -= p;
            p = (p * 2 > f ? f : p * 2);
        }
    }
    int ans = 0, cur;
    for(int i = g; i >= 0; i--)
        if(dp[i] != inf)
        {
            cur = i;
            ans = dp[i];
            break;
        }
    cout << cur << " " << ans << '\n';
    vector<int> retriv;
    while(cur)
    {
        retriv.push_back(cur - par[cur]);
        cur = par[cur];
    }
    reverse(retriv.begin(), retriv.end());
    for(auto i : retriv)
        cout << i << '\n';
    return 0;
}