P1284 模仿学习题解一,为什么编译错误呢
查看原帖
P1284 模仿学习题解一,为什么编译错误呢
1281336
sml259楼主2024/3/4 11:28
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int a[45];
bool dp[1000][1000];//表示用前i个木块可以构成怎样的三个边
//由于三角形的边长一定小于周长的一半,所以循环时可以从sum/2开始循环
double sum = 0;//周长
bool check(double a, double b, double c)
{
	if (a + b > c && a + c > b && b + c > a)
		return true;
	return false;
}
double area(double a, double b, double c)
{
	double q = (a + b + c) / 2;
	return sqrt(q * (q - a) * (q - b) * (q - c));//海伦公式
}


int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		sum += a[i];
	}
	dp[0][0] = true;
	for (int k = 1; k <= n; k++)
	{
		//需要去考虑木板的大小
		for (int i = sum / 2; i >= 0; i--)
		{
			for (int j = sum / 2; j >= 0; j--)
			{
				if ((i >= a[k] && dp[i - a[k]][j]) || (j >= a[k] && dp[i][j - a[k]]))//掌握这个状态转移方程是怎么推导出来的
					dp[i][j] = true;
			}
		}

	}
	double ans = -1;
	for(int i=1;i<=sum/2;i++)
		for (int j = 1; j <= sum / 2; j++)
		{
			if (dp[i][j] && check(i, j, sum - i - j))
			{
				ans = max(ans, area(i, j, sum - i - j));
				
			}
		}
	if(ans!=-1)
	ans= long long(ans*100);
	 cout << ans;

}
2024/3/4 11:28
加载中...