Cod sursa(job #1483149)

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

#define MAXN 17
#define DIM 512

int N, G, cnt[1 << MAXN], min[1 << MAXN], A[MAXN], pos = DIM, len;
char buf[DIM];

inline int r_int32(){
	while (buf[pos] < '0' || buf[pos] > '9'){
		if (++pos >= DIM) len = fread(buf, 1, DIM, stdin), pos = 0;
	}
	int val = 0;

	while (buf[pos] >= '0' && buf[pos] <= '9'){
		if (pos == len) break;
		val = val * 10 + buf[pos] - '0';
		if (++pos == DIM) len = fread(buf, 1, DIM, stdin), pos = 0;
	}
	return val;
}

inline void w_int32(int k){
	char lim[16], *s;
	s = lim + 15, *s = 0;

	do{
		*--s = k % 10 + '0';
		k /= 10;
	} while (k);
	puts(s);
}


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

	for (int test = 0; test < 3; ++test){
		N = r_int32(), G = r_int32();
		for (int i = 1; i <= N; ++i) A[i] = r_int32();

		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;
					}
				}
		w_int32(cnt[(1 << N) - 1]);
	}

	return 0;
}