您的位置:首页 > Web前端 > AngularJS

POJ 1948 TRIANGULAR PASTURES(背包问题)

2011-08-20 19:06 309 查看
原文:http://blog.acmj1991.com/?p=604

题意:给你n根火柴,让你用这些火柴拼凑出一个面积最大的三角形,求这个三角形的面积

思路:想了一阵子,因为一根火柴不能同时出现在同一个边中,所以开一个二维数组

dp[i][j]记录是否存在边长为i和j的三角形,为了不重复所以从后往前推

S=sqrt(x*(x-a)*(x-b)*(x-c)); (x=S/2)

#include<stdio.h>
#include<math.h>

#define maxN 1600
bool dp[maxN][maxN];
int max(int x,int y){return x>y?x:y;}

int main()
{
int len[45],n,sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&len[i]);
sum+=len[i];
}
dp[0][0]=1;
for(int i=0;i<n;i++)
for(int j=sum/2;j>=0;j--)
for(int k=sum/2;k>=0;k--)
if(j>=len[i]&&dp[j-len[i]][k]||k>=len[i]&&dp[j][k-len[i]])
dp[j][k]=1;
int maxx=-1;
for(int i=1;i<sum/2;i++)
for(int j=1;j<sum/2;j++)
if(dp[i][j])
{
int k=sum-i-j;
if(!(i+j>k&&i+k>j&&k+j>i))continue;
double m=(i+j+k+0.0000001)/2.0;
int s=100*sqrt(double(m*(m-i)*(m-j)*(m-k)));
maxx=max(maxx,s);
}
printf("%d\n",maxx);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: