看了网上的题解,是这样的:
设ai∈{-1,0,1},所求的集合可以视作Σai*xi=0,说得简单一点就是(以n = 6为例)
a1x1 + a2x2 + a3x3 + a4x4 + a5x5 + a6x6 = 0
基于这个思路编写了代码,发现有重复(代码会贴在最下面)。
然后我的想法是:重复就是多了一倍吧。也就是说,如果我的代码进行搜索,以下两种情况是重的:
然后还有一个所有都不选的情况要减掉,所以假设没有去重的时候计算得到的方案总数为 ans,那么实际方案总数应该是 2ans−1。
不过这样的思路好像是错的(因为我看题解里面都记录了状态囧),请大佬帮忙指教,万分感谢:)
下面是我的代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 22;
int n;
long long a[maxn], ans;
map<long long, int> mp;
void dfs1(int id, long long tmp) {
if (id > n/2) {
mp[tmp] ++;
return;
}
for (int i = -1; i <= 1; i ++)
dfs1(id+1, tmp + i * a[id]);
}
void dfs2(int id, long long tmp) {
if (id > n) {
ans += mp[-tmp];
return;
}
for (int i = -1; i <= 1; i ++)
dfs2(id+1, tmp + i * a[id]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
dfs1(1, 0);
dfs2(n/2+1, 0);
cout << ans << endl;
return 0;
}