tle 58 pts 求调
查看原帖
tle 58 pts 求调
1339022
123456Zhe楼主2025/7/22 10:05
#include<bits/stdc++.h>
using namespace std;
int n,a[21],ans=0;
map<int,vector<set<int>>> mp;
set<set<int>> vis;

void dfs1(int w,int sum,set<int>& v){
    if(w==n/2){
        mp[sum].push_back(v);
        return;
    }
    dfs1(w+1,sum,v);
    set<int> tmp=v;
    tmp.insert(w);
    dfs1(w+1,sum+a[w],tmp);
    tmp=v;
    tmp.insert(w);
    dfs1(w+1,sum-a[w],tmp);
}

void dfs2(int w,int sum,set<int>& v){
    if(w==n){
        if(mp.count(-sum)){
            for(auto& s:mp[-sum]){
                set<int> r=s;
                r.insert(v.begin(),v.end());
                if(!r.empty()&&vis.find(r)==vis.end()){
                    vis.insert(r);
                    ans++;
                }
            }
        }
        return;
    }
    dfs2(w+1,sum,v);
    set<int> tmp=v;
    tmp.insert(w);
    dfs2(w+1,sum+a[w],tmp);
    tmp=v;
    tmp.insert(w);
    dfs2(w+1,sum-a[w],tmp);
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    set<int> tmp;
    dfs1(0,0,tmp);
    tmp.clear();
    dfs2(n/2,0,tmp);
    cout<<ans<<endl;
    return 0;
}
2025/7/22 10:05
加载中...