去重的问题
查看原帖
去重的问题
291976
quanjun楼主2020/9/18 12:33

看了网上的题解,是这样的:

设ai∈{-1,0,1},所求的集合可以视作Σai*xi=0,说得简单一点就是(以n = 6为例)

a1x1 + a2x2 + a3x3 + a4x4 + a5x5 + a6x6 = 0

基于这个思路编写了代码,发现有重复(代码会贴在最下面)。

然后我的想法是:重复就是多了一倍吧。也就是说,如果我的代码进行搜索,以下两种情况是重的:

  • 第一组是1,21,2,第二组是33
  • 第一组是33,第二组是1,21,2

然后还有一个所有都不选的情况要减掉,所以假设没有去重的时候计算得到的方案总数为 ansans,那么实际方案总数应该是 ans12\frac{ans-1}{2}

不过这样的思路好像是错的(因为我看题解里面都记录了状态囧),请大佬帮忙指教,万分感谢:)

下面是我的代码:

#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;
}
2020/9/18 12:33
加载中...