hdu 4277 爆搜 set 去重

题目:

给出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;
}


你可能感兴趣的:(hdu 4277 爆搜 set 去重)