Pagini recente » Cod sursa (job #3280255) | Cod sursa (job #396036) | Cod sursa (job #1886791) | Cod sursa (job #1117460) | Cod sursa (job #3286288)
#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;
}