Cod sursa(job #112697)

Utilizator tvladTataranu Vlad tvlad Data 6 decembrie 2007 19:32:37
Problema Economie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

const int N = 1000;
const int VM = 5000;

int nv,n;
int v[N],a[N];
int wh[VM+1];

int main() {
	freopen("economie.in","rt",stdin);
	freopen("economie.out","wt",stdout);
	scanf("%d",&nv);
	int max = 0;
	for (int i = 0; i < nv; ++i) {
		scanf("%d",&v[i]);
		if (max < v[i]) max = v[i];
	}

	sort(v,v+nv);
	n = 1; a[0] = v[0];
	for (int i = 1; i < nv-1; ++i)
		if (a[n-1] != v[i]) a[n++] = v[i];

	wh[0] = false;
	wh[1] = true;
	for (int i = 2; i <= max; ++i) wh[i] = true;
	vector<int> s;
	for (int i = 0; i < n; ++i) {
		if (wh[a[i]]) {
			s.push_back(a[i]);
			for(int j = 1; j <= max; ++j) {
				if (j - a[i] >= 0 && !wh[j-a[i]]) {
					wh[j] = false;
				}
			}
		}
	}
	printf("%d\n",s.size());
	for (int i = 0; i<s.size(); ++i) printf("%d\n",s[i]);
	return 0;
}