Cod sursa(job #421801)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 21 martie 2010 17:11:33
Problema Economie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<fstream>
#include<algorithm>
#include<queue>
#define inf "economie.in"
#define outf "economie.out"
#define VMax 50001
#define NMax 1010
using namespace std;

fstream f(inf,ios::in),g(outf,ios::out);

int N;
int v[NMax];
int uz[NMax]; // uz[i]=1 daca folosim v[i]
int s[VMax]; //s[i]=1 daca se poate forma suma i
int s1[VMax];
queue<int> q;

void read()
{
f>>N;
for(int i=1; i<=N; i++) f>>v[i];
}

void solve()
{
int nr=0;
sort( v+1, v+N+1 );
for(int i=1; i<=N; i++)
	{
	s1[ v[i] ] = 1 ;
	for( int j=1; j<VMax; j++ )
		if( (s1[j]||s[j]) && j+v[i]<VMax  && !s1[ j+v[i] ] && !s[ j+v[i] ] ) s1[ j+v[i] ] = 1;
	for( int j=1; j<=N; j++ )
		if( s1[ v[j] ] && !s[ v[j] ] ) { uz[i]=1; break; }
	for( int j=1; j<VMax; j++ )
		if( s1[j] )
			{
			if( !s[j] ) s[j]=1, s1[j]=0;
			else s1[j]=0;
			}
	}
for( int i=1; i<=N; i++ )
	if( uz[i] ) q.push( i ), nr++ ;
g<<nr<<"\n";
while( !q.empty() )
	{
	g<< q.front() <<"\n";
	q.pop();
	}
}

int main()
{
read();
solve();
f.close();
g.close();
return 0;
}