給N根不同長度的木棍,求這些木棍一共能拼出多少個不同的不等邊三角形。注意在拼三角形的時候一定要用上所有的N根木棍。不同的定義是至少有一條邊的長度不相同;不等邊的定義是三條邊都不相等。
輸入格式:
第一行爲數據組數T,(1<=T<=15)。
接下來每行數據佔兩行,第一行爲木棍的數量N(1<=N<=15)
第二行有N個正整數li(1<=li<100),表示N個木棍的長度。保證每個長度都不相同。
輸出格式:每組數據輸出一個非負整數,表示能組成的不同的三角形個數。
樣例輸入:
1
3
2 3 4
樣例輸出:
1
代碼實現
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,l[15];//分別用於儲存木棍的數量和長度
bool h[10000];//判斷三角形是否已經存在
bool is_triangle(int a,int b,int c)//判斷三條邊是否能夠構成三角形
{
return !h[a*100+b] && a && b && c && a+b>c && a+c>b && b+c>a && ( h[a*100+b]=true );
}
int dfs(int index ,int a, int b,int c)// 用dfs暴力枚舉
{
if(index==n) //dfs終止條件
{
return a<b && b<c && is_triangle(a,b,c);
}
return dfs(index+1,a+l[index],b,c)+
dfs(index+1,a,b+l[index],c)+
dfs(index+1,a,b,c+l[index]);//dfs自身的遞歸
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&l[i]);
}
memset(h,0,sizeof(h));
printf("%d\n",dfs(0,0,0,0));
}
return 0;
}