Cod sursa(job #3286288)

Utilizator Lex._.Lexi Guiman Lex._. Data 13 martie 2025 22:18:04
Problema Economie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>
#define VMAX 50001
using namespace std;

int monede[1000]; //monedele citite
bitset<VMAX> poate_fi_scris_ca_suma; //bitset cu toate valorile monedelor; daca valoarea unei monede poate fi scrisa ca suma unor monede deja alese, salvam 1, daca nu 0

int main()
{
    ifstream cin("economie.in");
    ofstream cout("economie.out");
    int n; //numarul de monede
    cin >> n;
    for(int i=0; i<n; i++)
        cin >> monede[i]; //citim valorile monedelor
    sort(monede, monede+n); //sortam valorile monedelor crescator

    vector<int> monede_alese; //monedele alese
    monede_alese.reserve(1000);

    for(int i=0; i<n; i++)
    {
        if(poate_fi_scris_ca_suma[monede[i]]==0) //daca valoarea monedei nu poate fi scrisa ca suma altor monede
        {
            monede_alese.push_back(monede[i]); //adaugam moneda la vectorul cu monede alese
            poate_fi_scris_ca_suma[monede[i]]=1; //salvam ca valoarea monedei poate fi scrisa ca suma acum
            for(int j=1; j<VMAX-monede[i]; j++)
            {
                if(poate_fi_scris_ca_suma[j]==1) //daca numarul poate fi scris ca suma a monedelor deja alese, atunci si numarul +  monede[i] poate fi scris
                {
                    poate_fi_scris_ca_suma[j+monede[i]]=1;
                }
            }
        }
    }
    cout << monede_alese.size() << "\n"; //afisam numarul de monede alese
    for(auto moneda : monede_alese)
        cout << moneda << "\n"; //afisam monedele alese

    return 0;
}