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