Problem


alt


Solution


首先看到数据范围很小,小于等于8,第一反应就是可以用暴搜来做,依次枚举每种情况,取最大值即可得到答案。


Code


#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

const int N = 10;
int q[N];
double res;
int n;
bool st[N];


double ju(double a, double b, double c)  // 求三角形面积
{
    double p = (a + b + c) / 2;
    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    return s;
}

void dfs(int a, int b, int c, int index)  // 枚举每种情况
{
    if (a + b > c && a + c > b && b + c > a)
    {
        res = max(res, ju(a, b, c));
    }
    
    for (int i = index; i <= n; i++)
    {
        if (!st[i])
        {
            st[i] = true;
            dfs(a + q[i], b, c, index + 1);  // 分别加到三条边上
            dfs(a, b + q[i], c, index + 1);
            dfs(a, b, c + q[i], index + 1);
            st[i] = false;
            dfs(a, b, c, index + 1);  // 都不加
        }
        
    }
}



int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> q[i];
    
    dfs(0, 0, 0, 1);
    
    if (res > 0) printf("%.1lf", res);
    else cout << -1;
    
    return 0;
}