poj 1948 Triangular Pastures 二维背包

本文详细介绍了如何使用动态规划算法解决计算给定棍子中能够组合成最大三角形面积的问题,包括定义状态转移方程、初始化边界条件及最终求解过程。

题目大意:给定一些棍子求这些棍子能够组成的三角形的最大面积。

解题思路:这里要利用三角形的面积公式

p = (a + b + c) / 2, 周长的一半

三角形面积 = sqrt(p * (p - a) * (p - b) * (p - c))

dp[k][i][j]表示前k根棍子,边长为i和j是否能组成一个三角形。

所以dp[k][i][j] = dp[k-1][i - edge[k]][j] | dp[k-1][i][j - edge[k]];   其中要求 i >= edge[k], j >= edge[k];

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int maxn = 810;
bool dp[maxn][maxn];
int s, n, edge[maxn];
int main()
{
	
	while(scanf("%d", &n) != EOF)
	{
		memset(dp, 0, sizeof(dp));
		s = 0;
		for(int i = 0; i < n; i++)
		{
			scanf("%d", &edge[i]);
			s += edge[i];
		}
		int mid = s >> 1;
		dp[0][0] = true;
		for(int i = 0; i < n; i++)
		{
			for(int j = mid; j >= 0; j--)
			{
				for(int k = j; k >= 0; k--)
				{
					if(edge[i] <= j)
						dp[j][k] |= dp[j - edge[i]][k];
					if(edge[i] <= k)
						dp[j][k] |= dp[j][k - edge[i]];
				}
			}
		}
		double half = s / 2.0;
		double ans = -1;
		for(int i = 0; i < mid; i++)
		{
			for(int j = 0; j <= i; j++)
			{
				if(dp[i][j])
				{
					int k = s - i - j;
					if(i + j > k && i + k > j && j + k > i) //两边之和大于第三边 
						ans = max(ans, half * (half - i) * (half - j) * (half - k));
				}
			}
		}
		if(-1 == ans)
			printf("-1\n");
		else
			printf("%d\n", (int)(sqrt(ans) * 100)); 
	}
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值