题目描述
小魏有 3*n 根颜色两两不同的木棍,第i根的长度为a[i]。
小魏想把这3*n根木棍分成n组,每组三根,并且同一组的三根木棍可以组成一个三角形。
小魏想知道他有多少种不同的分组方案。认为两个分组方案是不同的,当且仅当两种方案组出来的三角形是不同的。
输入
第一行一个整数n。
第二行n个整数a[i]。
输出
一行一个整数,表示方案数。
cpp#include <cstdio> #include <algorithm> using namespace std; int n, a[30], b[30]; int mx; void dfs(int x) { if (b[x]) { dfs(x + 1); return; } if (x == n + 1) { mx++; return; } for (int i = x + 1; i <= n; i++) { if (b[i] == 0) { for (int j = i + 1; j <= n; j++) { if (b[j] == 0) { if (a[x] + a[i] > a[j]) { b[x] = b[i] = b[j] = 1; dfs(x + 1); b[x] = b[i] = b[j] = 0; } } } } } } int main() { scanf("%d", &n); n *= 3; for (int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a + 1, a + n + 1); dfs(1); printf("%d", mx); return 0; }