Cod sursa(job #111444)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 29 noiembrie 2007 20:41:10
Problema Economie Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
/* Ivan Nicolae - Infoarena */
/* Economie */
#include <stdio.h>
#include <string.h>

#define NMAX 1001
#define MMAX 50001
#define _fin  "economie.in"
#define _fout "economie.out"

int i,j,n,m,A[NMAX],k;
int C[NMAX],Mark[MMAX];

void Quick(int li, int ls, int A[])
{
 int i=li,j=ls,x=A[(li+ls)/2],y;
 while (i<=j)
      {
       while (A[i]<x) i++;
       while (A[j]>x) j--;
       if (i<=j)
         {
          y=A[i]; A[i]=A[j]; A[j]=y;
          i++; j--;
         }
      }
 if (i<ls) Quick(i,ls,A);
 if (li<j) Quick(li,j,A);
}

int main()
{
 freopen(_fin,"r",stdin);
 freopen(_fout,"w",stdout);

 scanf("%d",&n);
 int max=0;
 for (i=1;i<=n;i++)
    {
     scanf("%d",&A[i]);
     if (A[i]>max)
       max=A[i];
    }
 Quick(1,n,A);
 Mark[0]=1;
 for (k=1;k<=n;k++)
    {
     if (!Mark[A[k]])
       C[++C[0]]=A[k];
     for (i=0;i<=max;i++)
        if (Mark[i] && i+C[C[0]]<=max)
          Mark[i+C[C[0]]]=1;
    }

 printf("%d\n",C[0]);
 for (i=1;i<=C[0];i++)
    printf("%d\n",C[i]);

 fclose(stdin);
 fclose(stdout);
 return 0;
}