用的状态压缩,吸口氧91,不吸87。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[40],ans;
bool vis[5000000];
unordered_map<int,int> ma;
vector<int> f[60000];
int cnt;
void work(bool t,int l,int r){
for(int i=0;i<pow(3,r-l+1);i++){
int now=0,pow3=1,sum=0;
for(int j=l;j<=r;j++){
if((i/pow3)%3==1){
sum+=a[j];
now=now|(1<<j);
}
else if((i/pow3)%3==2){
sum-=a[j];
now=now|(1<<j);
}
pow3*=3;
}
if(t){
for(int i=0;i<f[ma[sum]].size();i++){
if(!vis[now|f[ma[sum]][i]]){
ans++;
vis[now|f[ma[sum]][i]]=true;
}
}
}
else{
if(ma[sum]==0) ma[sum]=++cnt;
f[ma[sum]].push_back(now);
}
}
}
signed main(){
ans=0;
cnt=0;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
memset(vis,false,sizeof(vis));
work(0,0,n/2-1);
work(1,n/2,n-1);
cout<<ans-1;
return 0;
}