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

  

 

相关文章:

  • 2021-06-28
  • 2022-12-23
  • 2022-12-23
  • 2020-03-30
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-20
猜你喜欢
  • 2022-12-23
  • 2021-11-14
  • 2022-12-23
  • 2022-01-14
  • 2021-05-23
  • 2021-06-28
  • 2022-02-23
相关资源
相似解决方案