许诺 • 2天前
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> lengths(n);
int total = 0;
for (int i = 0; i < n; ++i) {
cin >> lengths[i];
total += lengths[i];
}
int max_possible = total / 2;
vector<vector<bool>> dp(max_possible + 1, vector<bool>(n + 1, false));
dp[0][0] = true;
for (int l : lengths) {
for (int k = max_possible; k >= l; --k) {
for (int cnt = n - 1; cnt >= 0; --cnt) {
if (dp[k - l][cnt]) {
dp[k][cnt + 1] = true;
}
}
}
}
int max_area = -1;
for (int a = 1; a <= max_possible; ++a) {
for (int cnt_a = 1; cnt_a <= n; ++cnt_a) {
if (!dp[a][cnt_a]) continue;
int remaining = n - cnt_a;
if (remaining < 2) continue;
int max_b = (total - a) / 2;
for (int b = max(1, a); b <= max_b; ++b) {
for (int cnt_b = 1; cnt_b <= remaining; ++cnt_b) {
if (!dp[b][cnt_b]) continue;
int c = total - a - b;
if (c <= 0) continue;
if (a + b <= c) continue;
int cnt_c = n - cnt_a - cnt_b;
if (cnt_c < 1) continue;
if (!dp[c][cnt_c]) continue;
double s = total / 2.0;
double area = sqrt(s * (s - a) * (s - b) * (s - c));
int current_area = static_cast<int>(area * 100);
if (current_area > max_area) {
max_area = current_area;
}
}
}
}
}
cout << max_area << endl;
return 0;
}
评论:
请先登录,才能进行评论