Cod sursa(job #1483153)

Utilizator theprdvtheprdv theprdv Data 8 septembrie 2015 20:09:45
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <cstring>

#define MAXN 17

int N, G, cnt[1 << MAXN], min[1 << MAXN], A[MAXN];

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

	for (int test = 0; test < 3; ++test){
		scanf("%d %d", &N, &G);
		for (int i = 1; i <= N; ++i){
			scanf("%d", &A[i]);
			if (!A[i]) --i;
		}

		memset(min, 0, sizeof(int) * (1 << N));
		memset(cnt, 0, sizeof(int) * (1 << N));

		for (int conf = 1; conf < 1 << N; ++conf)
			for (int j = 0; j < N; ++j)
				if (conf & (1 << j)){
					int ins = conf ^ (1 << j),
						_min, _cnt;

					if (min[ins] + A[j + 1] <= G && cnt[ins]){
						_min = min[ins] + A[j + 1];
						_cnt = cnt[ins];
					}
					else {
						_min = min[ins] ? min[ins] : (1 << 31) - 1;
						if (_min > A[j + 1]) _min = A[j + 1];
						_cnt = cnt[ins] + 1;
					}

					if (!cnt[conf] || _cnt < cnt[conf] || (_cnt == cnt[conf] && _min < min[conf])){
						min[conf] = _min;
						cnt[conf] = _cnt;
					}
				}
		printf("%d\n", cnt[(1 << N) - 1]);
	}

	return 0;
}