社区讨论

抽象代码求调

P10484送礼物参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lzqoqiei
此快照首次捕获于
2024/08/12 15:41
2 年前
此快照最后确认于
2024/08/12 16:30
2 年前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll n, w, g[101];
vector <ll> a, b;
void dfs1(int i, ll v, int l, int r) {
	if (v > w)	return ;
	if (i == r + 1) {
		a.push_back(v);
		return ;
	}
	dfs1(i + 1, v + g[i], l, r);
	dfs1(i + 1, v, l, r);
}
void dfs2(int i, ll v, int l, int r) {
	if (v > w)	return ;
	if (i == r + 1) {
		b.push_back(v);
		return ;
	}
	dfs2(i + 1, v + g[i], l, r);
	dfs2(i + 1, v, l, r);
}
int main() {
	
	cin >> w >> n;
	
	for (int i = 1; i <= n; i++) 	cin >> g[i];
	int m = n / 2;
	dfs1(1, 0, 1, m);

	dfs2(m + 1, 0, m + 1, n);
	
	sort(b.begin(), b.end());
	ll maxx = -1;
	for (int i = 0; i < a.size(); i ++) {
		int l = 0, r = b.size(), mid; ll ans = INT_MAX;
		while (l <= r) {
			mid = (l + r + 1) >> 1;
			ans = min(ans, abs(w - (a[i] + b[mid])));
			if (w >= a[i] + b[mid]) {
				l = mid + 1;
			}else {
				r = mid - 1;
			}
		}
		maxx = max(maxx, ans + a[i]);
	}
	cout << maxx ;
	
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...