Cod sursa(job #2021722)

Utilizator lflorin29Florin Laiu lflorin29 Data 14 septembrie 2017 15:17:58
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <bits/stdc++.h>

using namespace std;

int const N = 17;

int n, g, v[N], minsplit[1 << N], minLast[1 << N];

void upd(int conf, int cursplit, int curlast) {
	if(cursplit < minsplit[conf]) {
		minsplit[conf] = cursplit;
		minLast[conf] = curlast;
	} else if(cursplit == minsplit[conf])minLast[conf] = min(minLast[conf], curlast);
}
int main() {
	ifstream cin("zebughil.in");
	ofstream cout("zebughil.out");

	for(int tc = 0; tc < 3; ++ tc) {
		cin >> n >> g;
		for(int i = 0; i < n; ++i )
			cin >> v[i];
		for(int c = 1; c < 1 << n; ++c) {
			minsplit[c] = __builtin_popcount(c);
			minLast[c] = g + 1;
		}
		minsplit[0] = 1, minLast[0] = 0;
		for(int c = 0; c < 1 << n; ++c) {
			for(int add = 0; add < n; ++add) {
				if((c & (1 << add)) == 0) {
					int nc = c | (1 << add);
					if(minLast[c] + v[add] <= g) {
						upd(nc, minsplit[c], minLast[c] + v[add]);
					} else upd(nc, minsplit[c] + 1, v[add]);
				}
			}
		}
		cout << minsplit[(1 << n) - 1] << '\n';
	}
	return 0;
}