Cod sursa(job #1804741)

Utilizator TincaMateiTinca Matei TincaMatei Data 12 noiembrie 2016 22:14:13
Problema Ghiozdan Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#include <algorithm>

const int MAX_N = 20000;
const int MAX_G = 75000;
const int INFINIT = 1000000000;
int v[MAX_N];
int d[MAX_G];
int ruksak[MAX_N];

bool cmp(int a, int b) {
  return a > b;
}

int min(int a, int b) {
  if(a < b)
    return a;
  return b;
}

int din(int i, int n, int g) {
  int rez;
  printf("%d %d %d\n", i, n, g);
  if(g < 0)
    return INFINIT;
  if(i >= n && g != 0)
    return INFINIT;
  if(d[g] >= INFINIT) {
    while(i < n && din(i + 1, n, g - v[i]) >= INFINIT)
      ++i;
    d[g] = din(i + 1, n, g - v[i]) + 1;
  }
  printf("!%d\n", d[g]);
  return d[g];
}

int main() {
  int n, g;
  FILE *fin = fopen("ghiozdan.in", "r");
  fscanf(fin, "%d%d", &n, &g);
  for(int i = 0; i < n; ++i)
    fscanf(fin, "%d", &v[i]);
  fclose(fin);

  std::sort(v, v + n, cmp);

  for(int i = 1; i <= g; ++i)
    d[i] = INFINIT;
  d[0] = 0;

  FILE *fout = fopen("ghiozdan.out", "w");
  while(din(0, n, g) >= INFINIT)
    g--;

  fprintf(fout, "%d %d\n", g, din(0, n, g));
  fclose(fout);
  return 0;
}