Cod sursa(job #157974)

Utilizator ktalyn2007Popa Catalin ktalyn2007 Data 13 martie 2008 13:20:03
Problema Economie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
/*Vultur este un veritabil colectionar de monezi si momentan colectia lui
numara N monezi  cu valori numere naturale intre 1 si 50000.El vrea sa-si
cumpere insa un acvariu nou pentru pestii sai si de aceea se gandeste sa
cedeze la banca o parte din monezi.Fiind un tip sensibil,el ar dori sa
obtina folosind monezile care i-au ramas sa poata fi posibil sa obtina
orice valoare a monezilor din cele N sa poata fi scrisa ca o suma de
valori ale monezilor din subsetul ales(valoarea unei monezi din subsetul
ales sa poata fi adunata de mai multe ori).*/
unsigned v[1000],sol[1000],c[1000],aux;
int i,j,kmin=0,n,ok,sters[1000]={0};

#include<stdio.h>
FILE *f1,*f2;
int main()
{
f1=fopen("economie.in","r");
fscanf(f1,"%i",&n);
for(i=0;i<n;i++)
fscanf(f1,"%u",&v[i]);
fclose(f1);

do{
ok=0;
for(i=0;i<n-1;i++)
if (v[i]>v[i+1])
{ok=1;
aux=v[i];
 v[i]=v[i+1];
 v[i+1]=aux;}
 }while(ok);


sol[kmin++]=v[0];
for(i=1;i<n;i++)
if(v[i]%v[0]==0) sters[i]=1;

for(i=0;i<n;i++)
{ //1
 for(j=i+1;j<n;j++)
	 if (v[j]%v[i]==0)
		 sters[j]=1;

if(!sters[i])
{ //2
aux=v[i];
 j=kmin-1;
	 do{ //3
			for(;j>=0;j--)
			 {c[j]=aux/sol[j];
				aux=aux%sol[j];}
				if(aux==0)
					sters[i]=1;
				else{//4
					 aux=aux+c[0]*sol[0];
				if(aux!=v[i])
				{//5
				j=1;
				while((j<kmin-1)&&(c[j]==0))j++;
				 c[j]=c[j]-1;
					aux=aux+sol[j];
					j=j-1;
					 }//5

					 }//4
						} //3

				 while((sters[i]==0)&&(aux!=v[i]));
				 if(sters[i]==0)
				 sol[kmin++]=v[i]; }
				 }//sf for i
f2=fopen("economie.out","w");
				 fprintf(f2,"%i\n",kmin);
				 for(i=0;i<kmin;i++)
				 fprintf(f2,"%u\n",sol[i]);


fclose(f1);
fclose(f2);
return 0;}