Cod sursa(job #110091)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 25 noiembrie 2007 17:13:36
Problema Economie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#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;    
}