题意:给出线段长度,求出组成面积最大的三角形的面积。
思路:dp的思路,又有点像暴力搜索的意思。开bool类型的dp[i][j]
dp[i][j] 表示边长为i,j的情况是否存在。
根据三角形的性质,任何一条边的长度都不可能超过周长的一半,可以用这个条件进行剪枝。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
const int maxn = 45;
int a[maxn],n;
bool dp[800][800];
int main()
{
while(cin>>n)
{
int sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];//求和
}
memset(dp,false,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<n;i++)
{
for(int j=sum/2;j>=0;j--)
for(int k=j;k>=0;k--)
{
if(((j>=a[i]) && (dp[j-a[i]][k]) || k>=a[i] && dp[j][k-a[i]]))//关键一步
dp[j][k] = 1;
}
}
int Mxn=-1;
for(int j=sum/2;j>=0;j--)
for(int k=j;k>=0;k--)
{
int p=sum-j-k;
if(dp[j][k] && (j+k>p) &&(p+k>j) && (j+p > k))
{
double z=(j+k+p)/2.0;
int t=(int)(sqrt(z*(z-p)*(z-j)*(z-k))*100);//公式求面积
Mxn=max(Mxn,t);
}
}
cout<<Mxn<<endl;
}
}