Cod sursa(job #393401)

Utilizator filipbFilip Cristian Buruiana filipb Data 9 februarie 2010 13:25:03
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#include <stdlib.h>

#define maxim(a, b) ((a > b) ? a : b)

int N, G, z[18], cnt;
short int bst[1<<17][18];

int bit(int x, int nr)
{ return (x & (1<<nr)) != 0; }

int main()
{
	int i, j, k;
	
	freopen("zebughil.in", "r", stdin);
	freopen("zebughil.out", "w", stdout);
	
	for (int T = 3; T; --T)
	{
		scanf("%d %d", &N, &G);
		for (i = 1; i <= N; ++i)
			scanf("%d", &z[i]);
	
		for (i = 0; i < (1<<N); ++i)
			for (j = 0; j <= N; ++j)
				bst[i][j] = -1;
		bst[0][0] = 0;
		for (i = 1; i < (1<<N); ++i)
			for (j = 1; j <= N; ++j)
			{	
				for (k = 0; k < N; ++k)
				{
					if (!bit(i, k)) continue;

					// pun in ultimul camion
					if (bst[i-(1<<k)][j] - z[k+1] >= 0)
						bst[i][j] = maxim(bst[i][j], bst[i-(1<<k)][j] - z[k+1]);
					// pun intr-unul nou
					if (bst[i-(1<<k)][j-1] != -1)
						bst[i][j] = maxim(bst[i][j], G-z[k+1]);
				}
			}
		cnt = -1;
		for (j = 1; j <= N && cnt == -1; ++j)
			if (bst[(1<<N)-1][j] != -1)
				cnt = j;
			
		printf("%d\n", cnt);
	}
	
	return 0;
}