rt
第35行int如不去掉,那就只有24分(其它全RE)
#include<bits/stdc++.h>
using namespace std;
int n,a[25];
vector<pair<int,int> >sum1,sum2;
int ans,mid;
map<int,vector<int> > lmp,rmp;
void dfs1(int l,int r,int S,int m){
if(l>=r){
sum1.push_back({S,m});
return;
}
dfs1(l+1,r,S+a[l],m|(1<<(l-1)));
dfs1(l+1,r,S-a[l],m|(1<<(l-1)));
dfs1(l+1,r,S,m);
}
void dfs2(int l,int r,int S,int m){
if(l>=r){
sum2.push_back({S,m});
return;
}
dfs2(l+1,r,S+a[l],m|(1<<(l-1-mid)));
dfs2(l+1,r,S-a[l],m|(1<<(l-1-mid)));
dfs2(l+1,r,S,m);
}
void pr(int a,int sum[]){
for(int i=1;i<=a;i++)cout<<sum[i]<<" ";
cout<<endl<<a<<endl;
}
signed main(){
//freopen("P3067_2.in","r",stdin);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int mid=n>>1;
dfs1(1,mid+1,0,0);
dfs2(mid+1,n+1,0,0);
int s;
for(auto &v:sum1){
lmp[v.first].push_back(v.second);
}
for(auto &v:sum2){
rmp[v.first].push_back(v.second);
}
bitset<1<<20> vis;
for(auto &v:lmp){
int p=v.first;
auto &lm=v.second;
int tp=-p;
if(rmp.find(tp)!=rmp.end()){
auto &rm=rmp[tp];
for(auto lk:lm){
for(auto rk:rm){
int tot=lk|(rk<<mid);
vis[tot]=1;
}
}
}
}
//pr(cnt1,sum1);
//pr(cnt2,sum2);
ans=vis.count();
if(vis[0]) ans--;
cout<<ans;
return 0;
}