知识点:双向搜索
这个是双向深搜,也是我的第一道双向搜索,所以挑了一个简单的题来写,还是比较简单的,以及要了解双向搜索是怎么降低时间复杂度的
#include <bits/stdc++.h>
using namespace std;
const int N = 1100005;
int n, cnt1, cnt2;
long long m, a[50], b[N], c[N];
void dfs1(int k, long long cur) {
if (cur > m) return;
if (k == n / 2 + 1) {
b[++cnt1] = cur;
return;
}
dfs1(k + 1, cur);
dfs1(k + 1, cur + a[k]);
}
void dfs2(int k, long long cur) {
if (cur > m) return;
if (k == n + 1) {
c[++cnt2] = cur;
return;
}
dfs2(k + 1, cur);
dfs2(k + 1, cur + a[k]);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
dfs1(1, 0);
dfs2(n / 2 + 1, 0);
sort(c + 1, c + cnt2 + 1);
long long ans = 0;
for (int i = 1; i <= cnt1; i++) {
int t = upper_bound(c + 1, c + cnt2 + 1, m - b[i]) - c;
ans += (long long) t - 1;
}
cout << ans;
return 0;
}