Cod sursa(job #1336100)

Utilizator hrazvanHarsan Razvan hrazvan Data 6 februarie 2015 17:31:27
Problema Economie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#define MAXN 1000
#define MAXV 50000
int v[MAXN], rez[MAXN], dr = 0;
char bun[MAXV + 1];

void qs(int st, int dr){
  int i = st, j = dr, piv = v[(st + dr) / 2], aux;
  while(i <= j){
    while(v[i] < piv)
      i++;
    while(v[j] > piv)
      j--;
    if(i <= j){
      aux = v[i];
      v[i] = v[j];
      v[j] = aux;
      i++;
      j--;
    }
  }
  if(st < j)
    qs(st, j);
  if(i < dr)
    qs(i, dr);
}

int main(){
  FILE *in = fopen("economie.in", "r");
  int n, i, j;
  fscanf(in, "%d", &n);
  for(i = 0; i < n; i++)
    fscanf(in, "%d", &v[i]);
  fclose(in);
  qs(0, n - 1);
  bun[0] = 1;
  for(i = 0; i < n; i++){
    if(!bun[v[i]]){
      rez[dr] = v[i];
      dr++;
      for(j = 0; j <= MAXV; j++){
        if(bun[j] && j + v[i] <= MAXV)
          bun[j + v[i]] = 1;
      }
    }
  }
  FILE *out = fopen("economie.out", "w");
  fprintf(out, "%d\n", dr);
  for(i = 0; i < dr; i++)
    fprintf(out, "%d\n", rez[i]);
  fclose(out);
  return 0;
}