#include <bits/stdc++.h>
#define int long long
using namespace std;
int a[50],n,ans=0,mid;
int suml[1050000],sumr[1050000],cntl=0,cntr=0;
void dfsl(int k,int s){
	//k代表目前正在决策第k个数,决策到第k个数的和为s 
	if(k>mid){
		suml[++cntl] = s;//把合理的方案存到左数组 
		return ;
	}
	dfsl(k+1 , s+a[k]);
	dfsl(k+1 , s); 
}
void dfsr(int k,int s){
	//k代表目前正在决策第k个数,决策到第k个数的和为s 
	if(k>n){
		sumr[++cntr] = s;//把合理的方案存到右数组 
		return ;
	}
	dfsr(k+1 , s+a[k]);
	dfsr(k+1 , s); 
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    mid = n/2;//1 ~ mid   mid+1 ~ n
    dfsl(1,0);//先对第一个数进行决策,和为0 
    dfsr(mid+1,0);//右边是先对第mid+1个数进行决策,和为0 
    sort(sumr+1,sumr+1+cntr);
    for(int i=1;i<=cntl;i++){
    	int pos = upper_bound(sumr+1,sumr+1+cntr,-suml[i]) - sumr;
    	ans += cntr-pos+1;
	}
	cout << ans;
	//折半深搜 
    return 0;
}

1 条评论

  • 1