Cod sursa(job #3140118)

Utilizator NiffSniffCojocaru Calin Marcu NiffSniff Data 3 iulie 2023 21:37:08
Problema Ghiozdan Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#include <vector>
using namespace std;
string file = "ghiozdan";
ifstream cin (file + ".in");
ofstream cout (file + ".out");
int v[75001],g;
vector <int> available;
short obiecte[201], marimi[75001];
void efectuare_rucsac(short x, bool &ok)
{
    vector <int> temp;
    for (int greutate : available)
    {
        int y = greutate+x;
        if (y > g)
            continue;
        if (!marimi[y])
        {
            ok = 1;
            temp.push_back(y);
            v[y] = greutate;
            marimi[y] = marimi[greutate] + 1;
        }
        else if (marimi[greutate] + 1 < marimi[y])
        {
            ok = 1;
            v[y] = greutate;
            marimi[y] = marimi[greutate] + 1;
        }
    }
    for (int x : temp)
    {
        available.push_back(x);
    }
}
int main()
{
    short n,x;
    cin >> n >> g;
    for (int i=1; i<=n; i++)
    {
        cin >> x;
        obiecte[x]++;
    }
    for (short i=200; i>=1; i--)
    {
        bool ok;
        if (obiecte[i])
        {
            obiecte[i]--;
            efectuare_rucsac(i,ok);

            if (!marimi[i])
            {
                available.push_back(i);
            }
            marimi[i] = 1;
        }
        while (obiecte[i]--)
        {
            ok = 0;
            efectuare_rucsac(i,ok);
            if (!ok)
                break;
        }

    }
    for (int i=g; i>=1; i--)
    {
        if (marimi[i])
        {
            cout << i << ' ' << marimi[i];
            while (i)
            {
                cout << '\n' << i - v[i];
                i = v[i];
            }
            break;
        }
    }
}