双向搜索 10 pts 求助
查看原帖
双向搜索 10 pts 求助
688783
SilverLi楼主2023/7/5 11:54
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
const int N = 45;
int n, w, v[N];
int sl[N], sr[N];
int ans, l, r, d;
void left(int i, int sum) {
	if (i == d + 1) {
		sl[++l] = sum;
		return;
	}
	if (sum + v[i] <= w)
		left(i + 1, sum + v[i]);
	left(i + 1, sum);
}
void right(int i, int sum) {
	if (i == n + 1) {
		sr[++r] = sum;
		return;
	}
	if (sum + v[i] <= w)
		right(i + 1, sum + v[i]);
	right(i + 1, sum);
}
#define all_sl sl + 1, sl + l + 1
signed main() {
	cin >> n >> w;
	for (int i = 1; i <= n; ++i)
		cin >> v[i];
	d = n / 2;
	left(1, 0);
	right(n - d, 0);
	sort(all_sl);
	sort(sr + 1, sr + r + 1);
	for (int i = 1; i <= r; ++i) {
		int k = upper_bound(all_sl, w - sr[i]) - sl;
		ans += k - 1;
	}
	cout << ans;
	return 0;
}

2023/7/5 11:54
加载中...