#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;
}HDU 5135 Little Zu Chongzhi's Triangles(状态压缩)
最新推荐文章于 2021-03-02 04:50:48 发布
本文深入探讨了利用计算几何原理解决多边形面积求解的问题,通过组合优化方法提高了求解效率。文章详细介绍了多边形面积计算公式、最大值比较函数以及在复杂多边形情况下的处理策略。此外,还阐述了如何通过遍历所有可能组合来优化计算过程,最终实现高效准确的面积求解。案例分析部分展示了实际应用场景,验证了方法的有效性和实用性。
4938

被折叠的 条评论
为什么被折叠?



