题意:n个棍子,棍子可以接起来,然后问你能够拼成多少个完全不同的三角形
思路:3^15=14 348 907,所以直接暴力然后hash一下就好
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define mem(a) memset(a,0,sizeof(a)) 5 #define mp(x,y) make_pair(x,y) 6 const int INF = 0x3f3f3f3f; 7 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 8 inline ll read(){ 9 ll x=0,f=1;char ch=getchar(); 10 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 11 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 12 return x*f; 13 } 14 ////////////////////////////////////////////////////////////////////////// 15 const int maxn = 1e5+10; 16 17 int n,len[20]; 18 set<ll> s; 19 20 void dfs(int a,int b,int c,int index){ 21 if(index == n+1){ 22 if(a*b*c == 0) return ; 23 if(a+b>c && a<=b && b<=c) 24 s.insert((ll)a*1000000000000+b*1000000+c); 25 return ; 26 } 27 28 dfs(a+len[index],b,c,index+1); 29 dfs(a,b+len[index],c,index+1); 30 dfs(a,b,c+len[index],index+1); 31 } 32 33 int main(){ 34 int T=read(); 35 while(T--){ 36 s.clear(); 37 n = read(); 38 for(int i=1; i<=n; i++){ 39 len[i] = read(); 40 } 41 dfs(0,0,0,1); 42 cout << s.size() << endl; 43 } 44 45 return 0; 46 }