Pagini recente » Cod sursa (job #1292077) | Cod sursa (job #2866089) | Cod sursa (job #1346285) | Cod sursa (job #1986053) | Cod sursa (job #110091)
Cod sursa(job #110091)
#include <stdio.h>
#include <stdlib.h>
long a[1002],v[50002],m[50002],t[50002];
bool ver[50002];
long n,i,j,q,max,min,poz;
int comp(const void *n1, const void *n2){
return *((long*)n1)-*((long*)n2);
}
int main(){
freopen("economie.in","r",stdin);
freopen("economie.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;i++)
scanf ("%ld",&a[i]);
qsort(a,n+1,sizeof(long),comp);
q=0;
for (i=1;i<=n;i++){
q++;
a[q]=a[i];if (a[q]>max)max=a[q];
while (a[q]==a[i+1]&&i<n)i++;
}
n=q;
for (i=1;i<=n;i++){v[a[i]]=1;t[a[i]]=-1;}
for (i=1;i<=max;i++){
while (!v[i]&&i<max)i++;
if (!v[i])break;
j=1;
while (a[j]+i<=max&&j<=n){
if (!v[i+a[j]]){
v[i+a[j]]=v[i]+1;
t[i+a[j]]=i;
}
else if (v[i+a[j]]<=v[i]){
v[i+a[j]]=v[i]+1;
t[i+a[j]]=i;
}
j++;
}
}
for (i=n;i>=1;i--){
if (!ver[a[i]]){
poz=a[i];
while (poz!=-1){
if (t[poz]==-1){
m[poz]=1;
}
else {m[poz-t[poz]]=1;ver[t[poz]]=1;}
poz=t[poz];
}
}
}
min=0;
for (i=1;i<=max;i++)if (m[i])min++;
printf("%ld\n",min);
for (i=1;i<=max;i++)
if (m[i])printf("%ld\n",i);
return 0;
}