poj1948

本文介绍了一种使用动态规划解决给定木棍拼成的最大三角形面积问题的方法。通过三维数组记录每两根木棍组合的可能性,并最终计算出所有可能组合中最大的三角形面积。

题意:给出一些木棍,必须全都用上,问能拼成的最大的三角形面积是多少。

分析:动态规划,f[i][j][k]表示用前i根木棍能否构成两条长度分别为j,k的边。

f[i][j][k] = f[i - 1][j][k];
if (j >= fence[i])
   f[i][j][k] = f[i][j][k] || f[i - 1][j - fence[i]][k];
if (k >= fence[i])
   f[i][j][k] = f[i][j][k] || f[i - 1][j][k - fence[i]];

以上过程只是构成两条边,第三条边的长度可以用总长度减去前两条边得到。 之前没有考虑这三条边是否能构成三角形。然后枚举所有的f[n][i][j]看能否构成三角形,并更新最大面积即可。

View Code
#include <iostream>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
#include
<cmath>
usingnamespace std;

#define maxn 41

int fence[maxn];
bool f[maxn][805][805];
int sum =0, n;

bool ok(int a, int b)
{
int c = sum - a - b;
if (c < a + b && c > abs(a - b))
returntrue;
returnfalse;
}

double area(int a, int b, int c)
{
double p = sum /2.0;
return sqrt(p * (p - a) * (p - b) * (p - c));
}

int main()
{
//freopen("t.txt", "r", stdin);
scanf("%d", &n);
for (int i =1; i <= n; i++)
{
scanf(
"%d", &fence[i]);
sum
+= fence[i];
}
memset(f,
0, sizeof(f));
f[
0][0][0] =true;
for (int i =1; i <= n; i++)
for (int j =0; j <= sum /2; j++)
for (int k =0; k <= sum /2; k++)
{
f[i][j][k]
= f[i -1][j][k];
if (j >= fence[i])
f[i][j][k]
= f[i][j][k] || f[i -1][j - fence[i]][k];
if (k >= fence[i])
f[i][j][k]
= f[i][j][k] || f[i -1][j][k - fence[i]];
}
double ans =-1;
for (int i =1; i <= sum /2; i++)
for (int j =1; j <= sum /2; j++)
if (f[n][i][j] && ok(i, j))
ans
= max(ans, area(i, j, sum - i - j));
if (ans >0)
ans
*=100;
printf(
"%d\n", (int)ans);
return0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值