Cod sursa(job #126711)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 22 ianuarie 2008 18:31:55
Problema Ghiozdan Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b)
{
   return *(int*)b - *(int*)a;
}

int v[20000], c[75001], n, g, nr[75001], sol[20001], x, last[75001];

int main()
{
   freopen("ghiozdan.in","r",stdin);
   freopen("ghiozdan.out","w",stdout);
   int i, j;
   scanf ("%d %d", &n, &g);

   for (i = 1; i <= n; i++)    scanf("%d",&v[i]);

//   qsort(v,n + 1, sizeof(int),cmp);

   c[0] = 1;

   for (i = 1; i <= n; i++)
   {
      for (j = 0; j <= g - v[i] + 1; j++)
	  {
		  if (c[j] && (nr[j+v[i]] == 0 || (nr[j + v[i]] == nr[j] + 1)) && (last[j] != i) && (nr[j+v[i]] > nr[j]+1 || nr[j+v[i]] == 0))
		  {
			c[j + v[i]] = j + 1;
			nr[j + v[i]] = nr[j] + 1;
			last[j + v[i]] = i;
			if (n > 500) break;
		  }
	  }
   }

   i = g;
   while (!c[i]) i--;

   printf("%d %d\n",i,nr[i]);
   while (i)
   {
      x++;
      printf("%d\n",i - (c[i] - 1));
      i = c[i] - 1;
   }
   return 0;
}