rt,找了半天没发现问题。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n;
const int N=50;
int a[N];
struct node{
int opt;
int state;
};
vector<node> L,R;
void dfs(int l,int r,int opt,int stat,vector<node>* addin){
if(l>r){
addin->push_back({opt,stat});
return;
}
dfs(l+1,r,opt+a[l],stat|(1<<(l-1)),addin);
dfs(l+1,r,opt-a[l],stat|(1<<(l-1)),addin);
dfs(l+1,r,opt,stat,addin);
}
int vis[1<<21],ans;
signed main(){
cin>>n;
rep(i,1,n)cin>>a[i];
dfs(1,(1+n)>>1,0,0,&L);
dfs(((1+n)>>1)+1,n,0,0,&R);
sort(L.begin(),L.end(),[](node a,node b){return a.opt<b.opt;});
sort(R.begin(),R.end(),[](node a,node b){return a.opt>b.opt;});
int l=0,r=0;
while(l<L.size()&&r<R.size()){
while(L[l].opt+R[r].opt>0)r++;
int ps=r;
while(r<R.size()&&L[l].opt+R[r].opt==0){
if(!vis[L[l].state|R[r].state]){
vis[L[l].state|R[r].state]=1;ans++;
}
r++;
}
if(l<L.size()&&L[l].opt==L[l+1].opt)r=ps;
l++;
}cout<<ans-1<<endl;
}