poj 1948 二维01背包
dp[i][j]代表能否组成一边长为i和一边长为j的三角形,剩下的一边就是sum-i-j了
接下来就是背包的做法了
#include<stdio.h> #include<math.h> #include<string.h> bool dp[810][810]; int get_area(int x,int y,int z) { double p=(x+y+z)/2.0; return int(sqrt(p*(p-x)*(p-y)*(p-z))*100); } int max(int a,int b) { return a>b?a:b; } int a[50]; int main() { int n,i,j,k,sum=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } int tmp=sum; sum/=2;sum++; memset(dp,false,sizeof(dp)); dp[0][0]=true; for(i=1;i<=n;i++) { for(j=sum;j>=0;j--) { for(k=sum;k>=0;k--) { if(j>=a[i]&&dp[j-a[i]][k] ||k>=a[i]&&dp[j][k-a[i]]) dp[j][k]=true; } } } int ans=-1; for(i=1;i<=sum;i++) for(j=1;j<=i;j++) if(dp[i][j]) ans=max(ans,get_area(i,j,tmp-i-j)); printf("%d\n",ans); return 0; }