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;
}

浙公网安备 33010602011771号