题意:
给n条边, 可以围成多少种不同的三角形
思路:
暴力枚举三角形的三条边分别由哪些边组成
hash三角形的三条边之后存到set中
最终答案是set的大小
code:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 20;
typedef long long LL;
int a[maxn];
int n;
int sum;
set<long long> se;
void dfs(int x, int y, int cur){
if(cur == n){
int z = sum - x - y;
if(x < y || y < z) return;
if(x + y > z && x + z > y && y + z > x){
se.insert(x*10000007LL + y*10007LL + z);
}
return;
}
dfs(x, y, cur+1);
dfs(x+a[cur], y, cur+1);
dfs(x, y+a[cur], cur+1);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
sum = 0;
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
sum += a[i];
}
se.clear();
dfs(0, 0, 0);
printf("%d\n", se.size());
}
return 0;
}