Cod sursa(job #2157911)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 9 martie 2018 23:53:14
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;

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

using i64 = long long;
using pll = pair<i64, i64>;

const int N = 17;


pll dp[1 << N];

vector<i64> blocks;
int n, g;


static void solve() {
	fi >> n >> g;
	blocks.resize(n);
	for (auto &i: blocks)
		fi >> i;

	for (int i = 0; i < (1 << n); ++i)
		dp[i] = {20, 0};
	dp[0] = {0, 0};

	for (int msk = 0; msk < (1 << n); ++msk) {
		for (int add = 0; add < n; ++add) if (~msk & (1 << add)) {
			pll &now = dp[msk | (1 << add)];
			if (dp[msk].y + blocks[add] <= g)
				now = min(now, pll(dp[msk].x, dp[msk].y + blocks[add]));
			else
				now = min(now, pll(dp[msk].x + 1, dp[msk].y + blocks[add] - g)); } }

	fo << dp[(1 << n) - 1].x + int(dp[(1 << n) - 1].y > 0) << endl; }


int main() {
	int tsk = 3;

	while (tsk--)
		solve();

	return 0; }