还以为有什么好的方法呢
/************************************************************** 作者:陈新 邮箱: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; }