还以为有什么好的方法呢
/**************************************************************
作者:陈新
邮箱:cx2pbirate@gmail.com
用途:pboj1948
时间:2014 4月13日 15:17
测试: 12749645 Will4944 1948 Accepted 10256K 219MS C++ 1284B 2014-04-13 16:00:54
*************************************************************/
#include <stdio.h>
#include <math.h>
#include <memory.h>
#define MAXN 45
#define MAXL 1605
int pb[MAXL][MAXL]; //...
int main(){
int n;
int len[MAXN];
while(scanf("%d",&n) != EOF){
for(int i = 0;i < n;i++){
scanf("%d",&len[i]);
}
memset(pb,0,sizeof(pb));
pb[0][0] = 1;
double sumLen = 0;
for(int i = 0;i < n;i++){
sumLen += len[i];
for(int j = sumLen;j >= 0;j--){
for(int k = j;k >= 0;k--){
if(j >= len[i]){
pb[j][k] = pb[j][k] || pb[j - len[i]][k];
}
if(k >= len[i]){
pb[j][k] = pb[j][k] || pb[j][k - len[i]];
}
}
}
}
double maxS = 0;
for(int a = 0;a < sumLen;a++){
for(int b = 0;b < sumLen;b++){
double c = sumLen - a - b;
if(!pb[a][b] || a + b <= c || a + c <= b || b + c <= a){
continue;
}
double p = sumLen / 2;
double s = sqrt(p * (p - a) * (p - b) * (p -c ));
maxS = maxS > s ? maxS : s;
}
}
if(maxS == 0){
printf("-1\n");
}
else{
printf("%d\n",(int)(maxS * 100));
}
}
return 0;
}