hdu 4277 爆搜 set 去重

来源:互联网 发布:阿里云 禁止ip访问 编辑:程序博客网 时间:2024/04/29 17:26
题目:

给出n条边,每条边有一定的长度,现在要用所有的边围成三角形,问能够围成多少个不同的三角形(三边至少有一边不等)。

#include<iostream>#include<algorithm>#include<cstdio>#include<set>using namespace std;int n,t,edge[17];int ans,sum;set<pair<int,int> >s;int min(int a,int b){    return a<b?a:b;}void dfs(int pos,int a,int b,int c){    if(pos==n)    {        int min2=min(a,b);        int e1,e2,e3;        e1=min(min2,c);        if(e1==a)        {            e2=min(b,c);        }        else if(e1==b)        {            e2=min(a,c);        }        else e2=min(a,b);        e3=sum-e1-e2;        if(e1+e2<=e3) return;        if(e3-e1>=e2) return;        if(s.find(make_pair(e1,e2))!=s.end()) return;        ans++;        s.insert(make_pair(e1,e2));        return ;    }    dfs(pos+1,a+edge[pos],b,c);    dfs(pos+1,a,b+edge[pos],c);    dfs(pos+1,a,b,c+edge[pos]);}int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        s.clear();        ans=sum=0;        for(int i=0;i<n;i++)        {            scanf("%d",&edge[i]);            sum+=edge[i];        }        dfs(1,edge[0],0,0);        printf("%d\n",ans);    }    return 0;}