题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4277
/*
Author:Bob Lee
2012.9.15
==================================================
题目的意思是给你n个木棍,问你可以组成多少个不同的三角形
最多15根
解题思路就是DFS枚举
把所有可能的情况枚举出来
难点就是判重的问题,这里用到了STL中的set容器
对于每一种情况,边的大小按顺序排列
然后有一个公式得到一个具体的值
如果没有重复的话,就是一种情况,加入到set里面
这里要注意我们自己写把三个排列的代码
自己开始偷懒用sort,果断TLE了
看来STL还是很有用的。
*/
#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
#define MAXN 16
set<long long> myset;
int n;
int data[MAXN];
int m;
int sum;
void dfs(int num,int x1,int x2,int x3)
{
if(num > n)
return;
if(x1+x2 > x3 && x2+x3 > x1 && x3+x1 > x2)
{
int a[3];
a[0] = x1;
a[1] = x2;
a[2] = x3;
if(a[0] > a[1])
swap(a[0],a[1]);
if(a[0] > a[2])
swap(a[0],a[2]);
if(a[1] > a[2])
swap(a[1],a[2]);
long long hash = a[0]+a[1]*sum+a[2]*sum*sum;
if(myset.find(hash) == myset.end())
{
m++;
myset.insert(hash);
}
}
if(x3-data[num]+x2>x1+data[num])
dfs(num+1,x1+data[num],x2,x3-data[num]);
if(x3-data[num]+x1>x2+data[num])
dfs(num+1,x1,x2+data[num],x3-data[num]);
dfs(num+1,x1,x2,x3);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
m=0;
sum = 0;
myset.clear();
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&data[i]);
sum+=data[i];
}
dfs(1,0,0,sum);
printf("%d\n",m);
}
return 0;
}