給定 ≤12 條邊長,可組成若干不重疊的三角形(每條邊最多用一次),求最大總面積。三角形面積用海倫公式。
mask(2ⁿ)表示已使用邊的集合。(i,j,k),若能構成三角形,記錄 tri_mask = (1< 及面積 area。dp[mask | tri_mask] = max(dp[mask | tri_mask], dp[mask] + area),條件 (mask & tri_mask) == 0。dp[mask] 最大值。#include <bits/stdc++.h>
using namespace std;
struct Tri { int mask; double area; };
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int n;
while (cin >> n, n) {
vector len(n);
for (int &x : len) cin >> x;
vector tris;
for (int i = 0; i < n; ++i)
for (int j = i+1; j < n; ++j)
for (int k = j+1; k < n; ++k) {
int a=len[i], b=len[j], c=len[k];
if (a+b>c && a+c>b && b+c>a) {
double p = (a+b+c)/2.0;
double s = sqrt(p*(p-a)*(p-b)*(p-c));
tris.push_back({(1< dp(ALL, 0);
double ans = 0;
for (int mask = 0; mask < ALL; ++mask) {
ans = max(ans, dp[mask]);
for (auto &t : tris) {
if ((mask & t.mask) == 0) {
int nmask = mask | t.mask;
dp[nmask] = max(dp[nmask], dp[mask] + t.area);
}
}
}
cout << fixed << setprecision(2) << ans << '\n';
}
return 0;
}
double 精度足夠。fixed << setprecision(2)。