Cod sursa(job #109357)

Utilizator znakeuJurba Andrei znakeu Data 25 noiembrie 2007 10:25:07
Problema Economie Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 0.87 kb
#include <stdio.h>
#include <stdlib.h>

FILE *in  = fopen("economie.in","r");
FILE *out = fopen("economie.out","w");

int v[1001],n,max;
int w[50001];
int m[1001],e;

int comp(const void *a, const void *b)
{
	int *aa=(int*) a, *bb=(int*) b;
	int x=*aa, y=*bb;
	if (x<y)
		return -1;
	if (x>y)
		return 1;
	return 0;
}



int main()
{
	int i,j;
	
	fscanf(in,"%d",&n);
	
	for (i=0; i<n; i++)
		fscanf(in,"%d",&v[i]);
	qsort(v,n,sizeof(v[0]),comp);
	
	max=v[n-1];
	m[0]=v[0];
	e=1;
	w[0]=1;

	for (i=0; i<=max; i++)
		if (w[i]==1 && i+m[e-1]<=50000)
			w[i+m[e-1]]=1;
	for (i=1; i<n; i++)
		if (w[v[i]]!=1)
		{
			m[e++]=v[i];
			for (j=0; j<=max; j++)
				if (w[j]==1 && j+m[e-1]<=50000)
					w[j+m[e-1]]=1;
		}
	
	fprintf(out,"%d\n",e);
	for (i=0; i<e; i++)
		fprintf(out,"%d\n",m[i]);
	
	fclose(in);
	fclose(out);
	
	return 0;
}