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