Cod sursa(job #720207)

Utilizator mottyMatei-Dan Epure motty Data 22 martie 2012 14:09:07
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>

using namespace std;

ifstream in("zebughil.in");
ofstream out("zebughil.out");

const int N = 18;
const int U = 1<<18;

int n, g;
int v[N];
int d[U+N][N];
bool filled[U+N][N];

void read()
{
	in >> n >> g;

	for (int i = 1; i <= n; ++i)
		in >> v[i];
}

inline int bit(int value) {
	return (1 << (value-1));
}

inline int minim(int a, int b) {
	return (a<b ? a:b);
}

void solve()
{
	memset(d, 0, sizeof(d));
	for (int i = 1; i <= n; ++i)
		d[bit(i)][1] = v[i];

	for (int conf = 0; conf < bit(n+1); ++conf)
		for (int camUsed = 1; camUsed < n; ++camUsed)
			if(d[conf][camUsed])
				for (int curStone = 1; curStone <= n; ++curStone) {
					if ((conf&bit(curStone)) == 0) {
						if (d[conf][camUsed] + v[curStone] <= g)
							if (d[conf][camUsed] + v[curStone] < d[conf + bit(curStone)][camUsed]
								|| d[conf + bit(curStone)][camUsed] == 0)
								d[conf + bit(curStone)][camUsed] = d[conf][camUsed] + v[curStone];

						if (minim(d[conf][camUsed], v[curStone]) < d[conf + bit(curStone)][camUsed+1]
							|| d[conf + bit(curStone)][camUsed+1] == 0)
							d[conf + bit(curStone)][camUsed+1] = minim(d[conf][camUsed], v[curStone]);
					}
				}

	for (int i = 1; i <= n; ++i)
		if (d[bit(n+1) - 1][i]) {
			out << i << "\n";
			return;
		}
}

int main()
{
	int t = 3;

	while (t--) {
		read();
		solve();
	}

	return 0;
}