Cod sursa(job #1885095)

Utilizator Mstar_AngelComan Mara Stefania Mstar_Angel Data 19 februarie 2017 16:49:51
Problema Ghiozdan Scor 66
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>
#define G 75010
#define N 20001
#define INF 2000000000
struct lab{
  int prev1, prev2, minim;
} obj[G];
int v[N];

void qsort (int begin, int end){
  int inc,sf;
  int pivot, aux;
  inc = begin; sf = end;
  pivot = v[(inc + sf)/2];
  while (inc <= sf){
    while (v[inc] > pivot)
      inc ++;
    while (v[sf] < pivot)
      sf --;
    if (inc <= sf){
      aux = v[inc];
      v[inc] = v[sf];
      v[sf] = aux;
      inc ++; sf --;
    }
  }
  if (begin < sf)
    qsort (begin, sf);
  if (inc < end)
    qsort (inc, sf);
}

int main (){
  FILE *in, *out;
  in = fopen ("ghiozdan.in","r");
  out = fopen ("ghiozdan.out","w");
  int n,g,i,j,minim,maxim;
  fscanf(in,"%d%d",&n,&g);
  for (i=1;i<=n;i++)
    fscanf(in,"%d",&v[i]);

  qsort (1,n);

  //obj[i] = nr minim de obj care au greut i
  for (i=1;i<=g;i++)
    obj[i].minim = INF;

  maxim = 0;
  for (i=1;i<=n;i++){
    for (j=g-v[i];j>=0;j--)
      if (obj[j].minim != INF && obj[j+v[i]].minim > obj[j].minim + 1){
        obj[j+v[i]].minim = obj[j].minim + 1;
        obj[j+v[i]].prev1 = v[i];
        obj[j+v[i]].prev2 = j;
        if (j+v[i] > maxim)
          maxim = j+v[i];
      }
  }
  fprintf (out,"%d %d\n",maxim,obj[maxim].minim);
  int poz = maxim;
  while (poz != 0){
    if (obj[poz].prev1 != 0)
      fprintf (out,"%d\n",obj[poz].prev1);
    poz = obj[poz].prev2;
  }

  fclose (in);
  fclose (out);
  return 0;
}