Cod sursa(job #1885233)

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

int main (){
  FILE *in, *out;
  in = fopen ("ghiozdan.in","r");
  out = fopen ("ghiozdan.out","w");
  int n,g,i,j,minim,maxim,nr,k;
  fscanf(in,"%d%d",&n,&g);

  for (i=1;i<=n;i++){
    fscanf(in,"%d",&nr);
    v[nr] ++;
  }

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

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

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