38ptsWA
思路就是,折半搜出两个集合可能的所有值。考虑若A1-B1=-(A2-B2),则A1+A2=B1+B2,所以记录A,B差值求方案数
之后由于若A,B互换造成答案翻倍,所以/2,但是考虑全是0的情况所以-1后/2
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=30,M=2e5+10;
int n,a[N],t[2];
ll p[2][M];
map<ll,ll> h;
void dfs(int now,int ed,ll A,ll B,int st){
if(now>ed){
p[st][++t[st]]=A-B;
return;
}
dfs(now+1,ed,A+a[now],B,st);
dfs(now+1,ed,A,B,st);
dfs(now+1,ed,A,B+a[now],st);
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1,n/2,0,0,0);dfs(n/2+1,n,0,0,1);
ll ans=0;
for(int i=1;i<=t[1];i++) h[p[1][i]]++;
for(int i=1;i<=t[0];i++) ans+=h[-p[0][i]];
printf("%lld",(ans-1)/2);
return 0;
}