Cod sursa(job #475833)

Utilizator CezarMocanCezar Mocan CezarMocan Data 8 august 2010 18:42:21
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#define maxN 18

using namespace std;


int N, G;
int z[maxN], sol;
int D[1 << 17][18];

int main() {
	int i, j, k;

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

	for (int tt = 1; tt <= 3; tt++) {
		scanf("%d%d", &N, &G);
		for (i = 1; i <= N; i++)
			scanf("%d", &z[i]);

		memset(D, -1, sizeof(D));
		D[0][0] = 0;
		
		for (i = 0; i < (1 << N); i++)
			for (j = 0; j <= N; j++) if (D[i][j] >= 0) {
//				fprintf(stderr, "%d %d -> %d\n", i, j, D[i][j]);
				for (k = 1; k <= N; k++) {
					if ((i & (1 << (k - 1))) == 0) {
						if (D[i][j] >= z[k]) 
							D[i | (1 << (k - 1))][j] = max(D[i | (1 << (k - 1))][j], D[i][j] - z[k]);
						else {
							D[i | (1 << (k - 1))][j + 1] = max(D[i | (1 << (k - 1))][j + 1], G - z[k]);
						}
					}
				}
			}

		for (sol = 1; sol <= N; sol++)
			if (D[(1 << N) - 1][sol] != -1)
				break;
		printf("%d\n", sol);
	}



	return 0;
}