Cod sursa(job #217585)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 28 octombrie 2008 23:13:09
Problema Zebughil Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <string.h>

#define MAX (1<<19)

int maxim(int x, int y) {return x > y ? x : y;}

int n, c[MAX][20], G, v[20], max;

int main()
{
	freopen("zebughil.in","r",stdin);
	freopen("zebughil.out","w",stdout);

	int i, j, k;

	for (int t = 1; t <= 3; t++)
	{
		scanf("%d %d",&n,&G);
		for (i = 0; i < n; i++) scanf("%d",v + i);

		max = (1<<n) - 1;

		for (i = 0; i <= max; i++)
			for (j = 0; j <= n; j++) c[i][j] = -1;
		
		c[0][0] = 0;
		for (i = 0; i <= max; i++)
			for (j = 0; j < n; j++)
				if (c[i][j] != -1)
					for (k = 0; k < n; k++)
						if ((i & (1 << k)) == 0)
						{
							if (c[i][j] >= v[k])
							{
								if (c[i + (1<<k)][j]) c[i + (1<<k)][j] = c[i][j] - v[k];
								else c[i + (1<<k)][j] = maxim(c[i + (1<<k)][j],c[i][j] - v[k]);
							}
							else c[i + (1<<k)][j + 1] = G - v[k];
						}

		for (i = 0; i <= n; i++) if (c[max][i] != -1) break;
		printf("%d\n",i);
	}
	return 0;
}