Cod sursa(job #18545)

Utilizator alex_damianDamian Alexandru alex_damian Data 18 februarie 2007 12:35:26
Problema Ghiozdan Scor 6
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 0.94 kb
#include <cstdio>

#define FIN "ghiozdan.in"
#define FOUT "ghiozdan.out"
#define MAXN 20005
#define MAXG 75005

long a[MAXN], s[MAXN][3];
long n, i, j, g, max, poz;

int main () {
	freopen(FIN, "r", stdin);
  freopen(FOUT, "w", stdout);
  scanf("%ld %ld", &n, &g);
  for (i=1; i<=n; i++) {
     scanf("%ld", &a[i]);
  }
	s[0][0] = 1;
  s[0][1] = 0;
  s[0][1] = 0;
  max = 0;
  for (i=1; i<=n; i++)
     for (j=max; j>=0; j--)
        if (s[j][0] && (!s[j+a[i]][0] || (s[j+a[i]][0] && s[j+a[i]][1] > s[j][1]))) {
          s[j+a[i]][0] = 1; s[j+a[i]][1] = s[j][1] + 1; s[j+a[i]][2] = a[i];
          if (j+a[i] > max) max = j+a[i];
          if (max > g - a[i+1]) max = g - a[i+1];
        }
  if (max>g) max = g;
  for (i=max; i>=0 && (s[i][0] == 0); i--) {
     }
  printf("%ld ", i);
  printf("%ld\n", s[i][1]);
  poz = s[i][2];
 /* while (poz != 0) {
    printf("%ld\n", poz);
    poz = s[poz][2];
  }*/
	return 0;
}