Cod sursa(job #110667)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 27 noiembrie 2007 11:24:20
Problema Economie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 1 << 10;
const int VMAX = 1 << 16;

int N, A[NMAX];
bool V[VMAX];
int NR, R[NMAX];

void read(void) {
	FILE *fin = fopen("economie.in", "rt");
	int i;

	fscanf(fin, " %d", &N);

	for (i = 0; i < N; ++i)
		fscanf(fin, " %d", A + i);

	fclose(fin);
}

void dinamica(void) {
	int i, v, stop = A[N - 1];

	V[0] = true;
	for (i = 0; i < N; ++i) {
		v = A[i];

		if (V[v] == true) continue;

		R[NR++] = v;

		for (i = 0; i + v <= stop; ++i)
			if (V[i]) V[i + v] = true;
	}
}

void write(void) {
	FILE *fout = fopen("economie.out", "wt");
	int i;

	fprintf(fout, "%d\n", NR);

	for (i = 0; i < NR; ++i)
		fprintf(fout, "%d\n", R[i]);

	fclose(fout);
}

int main(void) {

	read();

	sort(A, A + N);

	dinamica();

	write();

	return 0;
}