【动态规划/二维背包问题】mr355-三角形牧场
应该也是USACO的题目?同样没有找到具体出处。
【题目大意】
和所有人一样,奶牛喜欢变化。它们正在设想新造型牧场。奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度L(1≤L≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大。
请帮助Hei小姐构造这样的牧场,并计算出这个最大牧场的面积。
[输入]
第1行:一个整数N。
第2行起:包含N个用空格分隔的整数,即是每块木板的长度。
[输出]
仅一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1。
[样例输入]
mr355.in
5
1 1 3 3 4
[样例输出]
692
【思路】
二维背包问题,dp[i][ja][jb],取到第i块木板时能否组成ja、jb长度。预处理时,dp[0][0][0]=1,即取到第0块木板做成两边长度为0是可能的。这里有一个优化,tot表示当前已经取到的i块木板的总长度,ja、jb的长度判断只需从0..tot,如果当前dp[i-1][ja][jb]能取到,则dp[i][ja][jb],dp[i][ja+leng][jb],dp[i][ja][jb+leng]均能取到。这个时候我们发现,当前的dp[i]只和dp[i-1]相关,所以可以更改成滚动数组。
最后依次枚举前两边长度,并相减得出最后一边长度,如果能够组成三角形,则用海伦公式算出面积与最小值比较。
【易错点】
注意精度问题!double p=(a+b+c)*1.0/2,一定不能忘记要乘上0.1,否则会被视作整除去尾掉的!
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN=+;
int n,tot;
int leng[MAXN];
int dp[][][];
/*取到第几块木板,后面为前两块木板,这里用了滚动数组*/ void init()
{
scanf("%d",&n);
for (int i=;i<n;i++) scanf("%d",&leng[i]);
} void dpprocess()
{
memset(dp,,sizeof(dp));
dp[][][]=;
tot=;
/*当前已经取到的木块总长度*/
for (int k=;k<n;k++)
{
for (int i=;i<=tot;i++)
for (int j=i;j<=tot-i;j++)
{
if (dp[k%][i][j]==)
{
dp[(k+)%][i][j]=;
dp[(k+)%][i+leng[k]][j]=;
dp[(k+)%][i][j+leng[k]]=;
}
}
tot+=leng[k];
}
} void print()
{
int ans=-;
for (int a=;a<=tot;a++)
for (int b=a;b<=tot-a;b++)
{
if (dp[n%][a][b]==)
{
int c=tot-a-b;
if (a<b+c && b<a+c && c<a+b)
{
double p=(a+b+c)*1.0/;
double s=sqrt(p*(p-a)*(p-b)*(p-c))*;
if (s>ans)
{
ans=s;
}
}
}
}
cout<<ans<<endl;
} int main()
{
freopen("mr355.in9","r",stdin);
freopen("mr355.ou9","w",stdout);
init();
dpprocess();
print();
return ;
}
【动态规划/二维背包问题】mr355-三角形牧场的更多相关文章
- 动态规划(二维背包问题):UVAoj 473
Raucous Rockers You just inherited the rights to n previously unreleased songs recorded by the pop ...
- C语言-二维背包问题
二维费用背包问题 问题: 二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有 一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价 ...
- 【CodeForces】713 D. Animals and Puzzle 动态规划+二维ST表
[题目]D. Animals and Puzzle [题意]给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长.n,m<=1000,Q<=10^6. [算法]动态规划DP ...
- 【洛谷】【动态规划(二维)】P1508 Likecloud-吃、吃、吃
[题目描述:] 正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中.某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨 ...
- [ACM_动态规划] POJ 1050 To the Max ( 动态规划 二维 最大连续和 最大子矩阵)
Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...
- 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03
[题目描述:] ... (宣传luogu2的内容被自动省略) 洛谷的运营组决定,如果...,那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望. Kkks ...
- hdu2159FATE(二维背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2159 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在 ...
- SPOJ 181 - Scuba diver 二维背包
潜水员要潜水,给出n个气缸(1<=n<=1000),每个气缸中有氧气量为ti,氮气量为ai,气缸重量为wi(1<=ti<=21,1<=ai<=79,1<=wi ...
- 动态规划:HDU3496-Watch The Movie(二维费用的背包问题)
Watch The Movie Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
随机推荐
- bzoj 1058 bst
因为是数列的维护,所以我们可以考虑用splay来维护,每次在x插入的时候就在x+1前面插入就行了,然后用bst来维护两问的答案,但是应该会tle.我们来考虑这个问题的性质,首先因为这个数列没有删除操作 ...
- js_页面关闭beforeunload事件
做圆桌爆文公众号的时候,需要对阅读的文章进行时间统计.是这个公众号的核心功能,客户把文章转发到朋友圈或者转给朋友,记录谁阅读此文章和阅读时长进行记录,从而展示给客户. 功能点是,关闭页面时触发事件,请 ...
- 4.0docker部署
设置容器的端口映射 -P :容器暴露的所有端口映射 -p :指定映射容器暴露的端口 Nginx部暑流程 docker run -p 80 --name web -t -i ubuntu /bin/b ...
- ie8下input文字偏上select文字偏下
1.ie8下input文字偏上 正常情况下input的显示情况如下 当设置input的高度时,就会出现文字不垂直居中偏上的情况,如图 解决方案 强input的行高line-height与其高度设置一致 ...
- linux下删除已经不用的配置文件
使用命令 dpkg -l | grep -v ^ii 查看当前未安装或者不用了的配置文件 例如我的显示如下
- SUSE 11.3 linux ISO下载地址
http://linux.iingen.unam.mx/pub/Linux/Suse/isos/SLES11/ SLE-11-SP3-SDK-DVD-i586-GM-DVD1.iso 6deaa960 ...
- C#使用Linq To XML读取XML,Linq生成XML,Linq创建带属性或带节点XML
using System; using System.Linq; using System.Xml.Linq; namespace Sample2 { class Program { static v ...
- Android IPC
1. 什么是Android IPC IPC:inter-process Commnication跨进程的通信,多进程之间的通信,不同的操作系统有不同的通信方式,Android继承自Linux,但其IP ...
- [ python ] 类的组合
首先,使用面向对象是一个人狗大战的实例: class Person: def __init__(self, name, hp, aggr, sex): self.name = name self.hp ...
- Leetcode 之Length of Last Word(38)
做法很巧妙.分成左右两个对应的部分,遇到左半部分则入栈,遇到右半部分则判断对应的左半部分是否在栈顶.注意最后要判断堆栈是否为空. bool isValid(const string& s) { ...