HDU-5135

code
#include<bits/stdc++.h>
using namespace std;
int n;
double t[15];
double dp[1<<13];
vector<int> v;
bool check(double a, double b, double c) {
return a + b > c && fabs(c - b) < a;
}
double s(double a, double b, double c) {
double p = (a + b + c) / 2.0;
return sqrt(p * fabs(p-a) * fabs(p-b) * fabs(p-c));
}
void solve(double maxx = 0, double res = 0) {
v.clear();
for(int i = 1; i <= n - 2; ++ i) {
for(int j = i + 1; j <= n - 1; ++ j) {
for(int k = j + 1; k <= n; ++ k) {
if(check(t[i], t[j], t[k])) {
int tmp = (1<<i) | (1<<j) | (1<<k);
dp[tmp] = s(t[i], t[j], t[k]);
v.push_back(tmp);
}
}
}
}
for (int i = 0; i < (1<<n); ++ i) {
for (int j = 0; j < v.size(); ++ j) {
if (i & v[j]) continue;
dp[i|v[j]] = max(dp[i|v[j]], dp[i] + dp[v[j]]);
maxx = max(maxx, dp[i|v[j]]);
}
}
cout << fixed << setprecision(2) << maxx << endl;
}
int main() {
ios::sync_with_stdio(false);cin.tie(0);cout.tie(nullptr);
#ifdef ACM_LOCAL
freopen("input", "r", stdin);
freopen("output", "w", stdout);
#endif
while(cin >> n) {
if(!n) break;
memset(dp, 0, sizeof dp);
for(int i = 1; i <= n; ++ i) cin >> t[i];
sort(t + 1, t + 1 + n);
solve();
}
return 0;
}