题意:给出n条边,用这n条边构成一个三角形,求三角形的最大面积。

先求面积,用海伦公式,s=sqrt(p*(p-a)*(p-b)*(p-c)),其中a,b,c分别为三角形的三条边,p为三角形的半周长,同时由这个根式可以推出,三角形的任意一条边小于其半周长(根号里面大于0,如果等于0面积为0没有意义了)

所以考虑背包两条边,再用周长减去这两条边求出第三条边,再遍历一遍找出最大的三角形。

dp[i][j]表示三角形的第一条边为i,第二条边为j所构成的三角形是否存在,

如果存在,dp[i][j]=1,否则为0 当dp[i][j]=1的时候,dp[i+l[k]][j]和dp[i][j+l[k]]也为1

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std; int dp[][],l[]; int area(int a,int b,int c)
{
double p=(a+b+c)*0.5;
return int (sqrt(p*(p-a)*(p-b)*(p-c))*);
} int main()
{
int n,i,j,k,c;
while(scanf("%d",&n)!=EOF)
{
int sum=, ans=-;
for(i=;i<=n;i++) {scanf("%d",&l[i]);sum+=l[i];}
memset(dp,,sizeof(dp));
dp[][]=;
c=sum;
sum=c/-(c/==); for(k=;k<=n;k++)
for(i=sum;i>=;i--)
for(j=i;j>=;j--)
if(dp[i][j]) dp[i][j+l[k]]=dp[i+l[k]][j]=; for(i=sum;i>=;i--)
for(j=i;j>=;j--)
if(dp[i][j]) ans=max(ans,area(i,j,c-i-j));
printf("%d\n",ans);
}
return ;
}

还是看的题解= =,感觉这题的dp[][]数组的含义和那一题划分的有点像= = go--go

POJ 1948 Triangular Pastures【二维01背包】的更多相关文章

  1. [POJ] 1948 Triangular Pastures (DP)

    题目地址:http://poj.org/problem?id=1948 题目大意: 给N条边,把这些边组成一个三角形,问面积最大是多少?必须把所有边都用上. 解题思路: 根据题意周长c已知,求组合三边 ...

  2. hdu3496 二维01背包

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3496 //刚看题目以为是简单的二维01背包,but,,有WA点.. 思路:题中说,只能买M ...

  3. poj 1948 Triangular Pastures 小结

    Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The o ...

  4. hdu 2126 Buy the souvenirs 二维01背包方案总数

    Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. Leetcode_474. 一和零(二维01背包)

    每个字符串看成一个物品,两个属性是0和1的个数,转换为01背包. code class Solution { public: int w[605][2]; int dp[105][105]; int ...

  6. Triangular Pastures (二维01背包)

    描述Like everyone, cows enjoy variety. Their current fancy is new shapes for pastures. The old rectang ...

  7. poj 1948二维01背包

    题意:给出不多于40个小棍的长度,求出用所有小棍组成的三角形的最大面积. 思路:三角形3边求面积,海伦公式:p=(a+b+c)/2;S=p*(p-a)*(p-b)*(p-c);因为最大周长为1600  ...

  8. POJ - 1948 二维01背包

    T了两发,DP方程很简单粗暴 dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满 背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次 对于sum的枚举,其实i j ...

  9. poj3260 平衡问题(二维01背包)

    http://www.cnblogs.com/ziyi--caolu/p/3228090.html http://blog.csdn.net/lyy289065406/article/details/ ...

随机推荐

  1. c++11 内存模型解读

    c++11 内存模型解读 关于乱序 说到内存模型,首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序通常并不是总按着照源码中的顺序一一执行,此谓之乱序,乱序产生的原因可能有好几种: 编译器出于 ...

  2. 最长连续回文串(最优线性时间O(n))

    转自:http://blog.csdn.net/hopeztm/article/details/7932245 Given a string S, find the longest palindrom ...

  3. Message,MessageQueue,Looper,Handler详解

    Message,MessageQueue,Looper,Handler详解   一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列,存放消息的地方.每一个线程最 ...

  4. App接口设计1

    http://blog.csdn.net/newjueqi/article/details/44062849 http://www.tuicool.com/articles/YNZBna http:/ ...

  5. Linux :Can't start up: not enough memory

    http://stackoverflow.com/questions/9634577/linux-cant-start-up-not-enough-memory

  6. BZOJ 1143 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Description 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动. ...

  7. linux下top命令查看cpu占用情况

    可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会以全屏的方式显示,并且会处在对话的模式 -- 用基于 top 的命令,可以控制显示方式等等.退出 top 的命令 ...

  8. 关于在linux下清屏的几种技巧

    在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢?下面笔者分享几种在linux下用过的清屏方法. 1.clear命令.这个命令将会刷新屏幕,本质上只是 ...

  9. Spark基础与Java Api介绍

    原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3832405.html  一.Spark简介 1.什么是Spark 发源于AMPLab实验室的分布式内存计 ...

  10. Solution中的auto test case组织方式

    在一个solution中所有的auto test case都需要写在一个类中,即*.cs文件中.实现某一个case 我们可以写一个方法.一个方法实现一个test case.这个方法前面要用[TestM ...