Cod sursa(job #1467442)

Utilizator greenadexIulia Harasim greenadex Data 3 august 2015 14:12:38
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
#define pii pair<int, int>
#define mp make_pair

using namespace std;

const string name = "zebughil",
             in_file = name + ".in",
             out_file = name + ".out";

ifstream fin(in_file);
ofstream fout(out_file);

const int MAX = 131072, NMAX = 18, oo = 2 * (1e9) + 1;
int n, g, v[NMAX], dp[MAX], free_space[MAX];

int main() {
	for (int t = 3; t; t--) {
		fin >> n >> g;
		for (int i = 0; i < n; i++)
			fin >> v[i];

		memset(free_space, 0, sizeof(free_space));

		for (int i = 1; i < MAX; i++)
			dp[i] = oo;

		dp[0] = 0;

		int max_mask = (1 << n) - 1;

		for (int mask = 0; mask < max_mask; mask++) {
			for (int i = 0; i < n; i++)
				if (!((1 << i) & mask)){
					int newmask = (1 << i) + mask,
						new_cnt = (free_space[mask] < v[i] ? dp[mask] + 1: dp[mask]),
						new_free = (free_space[mask] < v[i] ? g - v[i]: free_space[mask] - v[i]);
					if (new_cnt < dp[newmask]){
						dp[newmask] = new_cnt;
						free_space[newmask] = new_free;
					}else if (new_cnt == dp[newmask])
						free_space[newmask] = max(free_space[newmask], new_free);
				}
		}

		fout << dp[max_mask] << '\n';
	}

	return 0;
}