题意:给n个正整数,代表n条边,现将n条边拼成一个三角形(每条边都要用到),问能组成多少个不同的三角形。
View Code
#include <stdio.h> #include <algorithm> #include <set> using namespace std; #define MP make_pair int l[15],n; int x[3]; struct pro { int ans,sum; set<pair<int,pair<int,int> > > Set; void init() { ans=sum=0; Set.clear(); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&l[i]); sum+=l[i]; } } void dfs(int a,int b,int c,int k) { x[0]=a,x[1]=b,x[2]=c; sort(x,x+3); if(x[2]*2>=sum) return; if(Set.count(MP(x[0],MP(x[1],x[2])))) return; Set.insert(MP(x[0],MP(x[1],x[2]))); if(k==n) { ans++; return; } dfs(a+l[k],b,c,k+1); dfs(a,b+l[k],c,k+1); dfs(a,b,c+l[k],k+1); } void solve() { dfs(0,0,0,0); printf("%d\n",ans); } }p; int main() { int t; scanf("%d",&t); while(t--) { p.init(); p.solve(); } return 0; }