#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
struct p{
int x;
int y;
int z;
double S;
}
point[232];
double dian[15];
int c;
double dp[10000];
double mianji(int a,int b,int c){
double P=(a+b+c)/2.0;
return sqrt(P*(P-a)*(P-b)*(P-c));
}
double max(double a,double b){
if(a>b)
return a;
else
return b;
}
int main(){
//freopen("G://test.txt","r",stdin);
int n,m,i,j,k;
while(scanf("%d",&n)!=EOF&&n!=0){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;++i){
scanf("%lf",&dian[i]);
}
c=0;
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
for(int k=j+1;k<=n;++k){
if(dian[i]+dian[j]>dian[k]&&dian[k]+dian[j]>dian[i]&&dian[i]+dian[k]>dian[j]){
point[c].x=i;
point[c].y=j;
point[c].z=k;
point[c++].S=mianji(dian[i],dian[j],dian[k]);
}
}
}
}//处理点
for(int i=0;i<c;++i){
for(int j=0;j<=(1<<n)-1;++j){
if( ((j>>(point[i].x-1))%2==0) &&((j>>(point[i].y-1))%2==0) &&((j>>(point[i].z-1))%2==0)){
int X=(1<<(point[i].x-1))+(1<<(point[i].y-1))+(1<<(point[i].z-1));
dp[j+X]=max(dp[j]+point[i].S,dp[j+X]);
//printf("%d %d %d %lf %lf %lf %d\n",point[i].x,point[i].y,point[i].z,point[i].S,dp[i],dp[i+X],X);
}
}
}
double mm=0;
//printf("%d\n",(1<<n)-1);
for(int i=0;i<=(1<<n)-1;++i){
if(dp[i]>mm)
mm=dp[i];
}
printf("%.2lf\n",mm);
}
return 0;
}