没什么好方法,只能用dfs了。
代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cmath> 6 #include<set> 7 #define I(x) scanf("%d",&x) 8 using namespace std; 9 int a[20],n,ans; 10 set<pair<int,int> > p; 11 void dfs(int pos,int sum1,int sum2,int sum3) 12 { 13 int i,j,k; 14 if(pos==n){ 15 if(sum2==0||sum3==0) return ; 16 i=min(sum1,sum2); 17 i=min(i,sum3); 18 j=max(sum1,sum2); 19 j=max(j,sum3); 20 if(p.find(make_pair(i,j))!=p.end()) return ; 21 if(sum1+sum2>sum3&&abs(sum1-sum2)<sum3){ 22 ans++; 23 p.insert(make_pair(i,j)); 24 } 25 return; 26 } 27 dfs(pos+1,sum1+a[pos],sum2,sum3); 28 dfs(pos+1,sum1,sum2+a[pos],sum3); 29 dfs(pos+1,sum1,sum2,sum3+a[pos]); 30 } 31 int main() 32 { 33 int t,i; 34 I(t); 35 while(t--){ 36 I(n); 37 p.clear(); 38 for(i=0;i<n;i++) I(a[i]); 39 ans=0; 40 dfs(1,a[0],0,0); 41 printf("%d ",ans); 42 } 43 return 0; 44 }