枚舉3^15種情況,不同的三角形用set去重。
先讓所有段加入一條邊,在逐個移動至另外兩邊,枚舉所有的情況
卡著時間過去的...........
include <cstdio> #include <cmath> #include <iostream> #include <algorithm> #include <cstring> #include <set> using namespace std; int a[22]; int n; int sum,ans,flag; struct node { int x,y,z; bool operator < (const node &a) const { if(a.x != x) return a.x < x; if(a.y != y) return a.y < y; return a.z < z; } }; set <node> s; //自定義set void init() { s.clear(); } void dfs(int v0,int v1,int v2,int i) { if(i >= n) return ; if(v0 + v1 > v2 && v0 + v2 > v1 && v1 + v2 > v0) { int a1,a2,a3,tmp; node t; a1 = v0; a2 = v1; a3 = v2; if (a2 > a3) { swap(a2,a3); } if (a1 > a2) { swap(a1,a2); } if (a2 > a3) { swap(a2,a3); } t.x = a1; t.y = a2; t.z = a3; s.insert(t); } //每個i,三種選擇 if(v0 + v1 - a[i] > v2 + a[i]) dfs(v0 - a[i],v1,v2 + a[i] ,i+1); if(v0 + v2 - a[i] > v1 + a[i]) dfs(v0 - a[i],v1 + a[i],v2, i+1); dfs(v0,v1,v2,i+1); } int main() { int T; cin >> T; while(T --) { init(); scanf("%d",&n); sum = 0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum += a[i]; } dfs(sum,0,0,0); printf("%d\n",s.size()); } return 0; } #include <cstdio> #include <cmath> #include <iostream> #include <algorithm> #include <cstring> #include <set> using namespace std; int a[22]; int n; int sum,ans,flag; struct node { int x,y,z; bool operator < (const node &a) const { if(a.x != x) return a.x < x; if(a.y != y) return a.y < y; return a.z < z; } }; set <node> s; //自定義set void init() { s.clear(); } void dfs(int v0,int v1,int v2,int i) { if(i >= n) return ; if(v0 + v1 > v2 && v0 + v2 > v1 && v1 + v2 > v0) { int a1,a2,a3,tmp; node t; a1 = v0; a2 = v1; a3 = v2; if (a2 > a3) { swap(a2,a3); } if (a1 > a2) { swap(a1,a2); } if (a2 > a3) { swap(a2,a3); } t.x = a1; t.y = a2; t.z = a3; s.insert(t); } //每個i,三種選擇 if(v0 + v1 - a[i] > v2 + a[i]) dfs(v0 - a[i],v1,v2 + a[i] ,i+1); if(v0 + v2 - a[i] > v1 + a[i]) dfs(v0 - a[i],v1 + a[i],v2, i+1); dfs(v0,v1,v2,i+1); } int main() { int T; cin >> T; while(T --) { init(); scanf("%d",&n); sum = 0; for(int i=0; i<n; i++) { scanf("%d",&a[i]); sum += a[i]; } dfs(sum,0,0,0); printf("%d\n",s.size()); } return 0; }