Cod sursa(job #126821)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 22 ianuarie 2008 21:13:34
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <stdlib.h>

int n, g, v[201], c[75000], nr[75000];

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

   for (i = 1; i <= n; i++)   
   {
	   scanf("%d", &x);
	   v[x]++;
	   if (x > max ) max = x;
   }

   c[0] = 1;


   for (i = max; i >= 1; i--)
   {
	   ok = 1;
       if (v[i])
       for (j = g; j >= 0; j--)
	   {
		   if (c[j])
		   {
			   for (k = 1; j + (k * i) <= g && k <= v[i]; k++)
			   {       if (nr[k*i+j] == 0|| nr[k * i + j] > nr[j] + k + 1)
				{
				   c[k * i + j] = (k - 1) * i + j + 1;
				   nr[k * i + j] = nr[j] + k;
				   ok = 0 ;
                }
			     
			   }
		   }
		   if (n>500 && !ok) 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;
}