Pagini recente » Cod sursa (job #2829200) | Cod sursa (job #1149070) | Cod sursa (job #120484) | Cod sursa (job #1269451) | Cod sursa (job #110867)
Cod sursa(job #110867)
#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;
}