Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1099 Accepted Submission(s): 398
#include<stdio.h> #include<math.h> #include<iostream> #include<algorithm> #include<map> using namespace std; const int MAXN=20; int a[MAXN]; map <long long,int> mp; int tol; int n; int sum; void dfs(int l1,int l2,int l3,int i) { if(l1>l2)swap(l1,l2); if(l1>l3)swap(l1,l3); if(l2>l3)swap(l2,l3); if(l3*2>sum)return; if(i==n) { if(l1+l2>l3) { long long t=l1*150000*150000+l2*150000+l3; if(mp[t]==0) { mp[t]=1; tol++; } } return; } int t11=l1+a[i+1]; int t12=l2; int t13=l3; if(t11>t12)swap(t11,t12); if(t11>t13)swap(t11,t13); if(t12>t13)swap(t12,t13); dfs(t11,t12,t13,i+1); int t21=l1; int t22=l2+a[i+1]; int t23=l3; if(t21>t22)swap(t21,t22); if(t21>t23)swap(t21,t23); if(t22>t23)swap(t22,t23); if(t11!=t22 || t12!=t22 ||t13!=t23)dfs(t21,t22,t23,i+1); int t31=l1; int t32=l2; int t33=l3+a[i+1]; if(t31>t32)swap(t31,t32); if(t31>t33)swap(t31,t33); if(t32>t33)swap(t32,t33); if(t31!=t11||t32!=t12||t33!=t13) if(t31!=t21||t32!=t22||t33!=t23) dfs(t31,t32,t33,i+1); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); sum=0; for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];} mp.clear(); tol=0; dfs(0,0,0,0); printf("%d\n",tol); } return 0; }