Cod sursa(job #110867)

Utilizator floringh06Florin Ghesu floringh06 Data 27 noiembrie 2007 21:39:08
Problema Economie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <cstdio>
#include <cstring>

using namespace std;

#define FIN "economie.in"
#define FOUT "economie.out"
#define MAX_N 1005
#define MAX_V 50005

unsigned char P[MAX_V];
int A[MAX_N];
int S[MAX_N];
int max;

int N, i;

     void sort(int n)
     {
          int i, j, k, aux;
          for (i = 1; i <= n; i++)
          {
           j = i;
           while (j / 2 && A[j / 2] < A[j])
           { 
               aux = A[j / 2]; 
               A[j / 2] = A[j]; 
               A[j] = aux; 
               j >>= 1;
           }
          } 
          i = n;
          while (i > 1)
          {
           aux = A[i]; 
           A[i] = A[1];
           A[1] = aux;
           i--;
           j=1;
           while (1)
           {
            k = 2*j;
            if (k > i) break;
            if (k+1 <= i && A[k + 1] > A[k]) k++;
            if (A[j] >= A[k]) break;
            aux = A[k];
            A[k] = A[j];
            A[j] = aux;
            j = k; 
           }
          }
     }        

     void solve ()
     {
          int i, j;
          memset (P, 0, sizeof (P));
          int Ct = 0;
          int k = 0;
          for (i = 1; i <= N; ++i)
          {
              if (P[A[i]] == 0)
              {
                 S[++k] = A[i];
                 P[A[i]] = 1;
                 for (j = 1; j + A[i] <= max; ++j)
                     if (P[j] == 1) P[j + A[i]] = 1;
              }
          }
          printf ("%d\n", k);
          for (i = 1; i <= k; ++i)
           printf ("%d\n", S[i]);
     }

    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        scanf ("%d", &N);
        for (i = 1; i <= N; ++i) 
        {
            scanf ("%d", A + i);
            if (A[i] > max) max = A[i] + 1;
        }
        
        sort (N);
        solve();
        
        return 0;
    }