USACO ORZ----HDU_4277----DFS+STL+枚举

来源:互联网 发布:华夏网络徐兴东 编辑:程序博客网 时间:2024/06/08 05:42

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4277


/*Author:Bob Lee2012.9.15==================================================题目的意思是给你n个木棍,问你可以组成多少个不同的三角形最多15根解题思路就是DFS枚举把所有可能的情况枚举出来难点就是判重的问题,这里用到了STL中的set容器对于每一种情况,边的大小按顺序排列然后有一个公式得到一个具体的值如果没有重复的话,就是一种情况,加入到set里面这里要注意我们自己写把三个排列的代码自己开始偷懒用sort,果断TLE了看来STL还是很有用的。*/#include<iostream>#include<cstdio>#include<set>#include<algorithm>using namespace std;#define MAXN 16set<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;}