#include<bits/stdc++.h>
using namespace std;
int n;
bool dp[55][1255][1255]; //dp[i][j][o]前i块木板能否组成两边长度分别为j,o的三角形;
int suml; //总长度
int check(int x,int y,int z){
if(x+y<=z||x+z<=y||y+z<=x) return -1; //不能组成三角形
double p=(double)(x+y+z)/2;
p=sqrt(p*(p-x)*(p-y)*(p-z));
return p*100;
}
int main(){
cin>>n;
dp[0][0][0]=true; //初始化
for(int i=1;i<=n;i++){
int l;
cin>>l;
suml+=l;
for(int j=0;j<=suml;j++){
for(int o=0;o+j<=suml;o++){
dp[i][j][o]=dp[i-1][j][o];
if(j>=l) dp[i][j][o]=dp[i][j][o]|dp[i-1][j-l][o];
if(o>=l) dp[i][j][o]=dp[i][j][o]|dp[i-1][j][o-l];
}
}
}
int ans=-2;
for(int j=1;j<=suml/2;j++){
for(int o=1;o<=suml/2;o++){
if(dp[n][j][o])
ans=max(ans,check(j,o,suml-j-o));
}
}
cout<<ans<<endl;
return 0;
}
全部回复 共 0 条
还没有人回复。往下写第一条。
发表回复
登录后即可回复本帖,与出题人和同学一起讨论。
登录