計蒜課-統計三角形

給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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章