HDOJ5543 Pick The Sticks
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543
题目大意:有n个金条,每个金条有长度和价值,给一个长度为L的容器,当金条在容器两端的时候,只要重心在容器内也可以放下,问最多能获得的价值。
思路:01背包,但是重心怎么处理,最好的肯定是边界情况也就是刚好金条刚好能伸出一半,或者直接只取一根金条然后放在容器里面。
多开一位 dp[i][j][k]代表当前选第i个背包容量为j有k个超出边缘的金条时所能获得的最大价值
状态转移方程 dp[i][j][2]=max(dp[i-1][j-w[i]][2]+v[i],dp[i-1][j-w[i]/2][1]+v[i],dp[i][j][2])
dp[i][j][1]=max(dp[i-1][j-w[i]][1]+v[i],dp[i-1][j-w[i]/2][0]+v[i],dp[i][j][1])
dp[i][j][0]=max(dp[i-1][j-w[i]][0]+v[i],dp[i][j][0])
如果没有第一维i的话,那么j和k都要从大到小搞,很明显dp[j][1]是会影响到dp[j][2]的
处理整除的情况很简单,容器和金条长度都*2就好了,这样就能保证一定整除
最后不要忘了放一个的情况要特判一下
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=;
long long dp[maxn][];
long long v[maxn],w[maxn];
void init(){
memset(dp,,sizeof(dp));
}
void beibao(int pos,int V) {
for(int i=V;i>=w[pos]/;i--) {
dp[i][]=max(dp[i-w[pos]/][]+v[pos],dp[i][]);
if(i>=w[pos])
dp[i][]=max(dp[i-w[pos]][]+v[pos],dp[i][]);
} for(int i=V;i>=w[pos]/;i--){
dp[i][]=max(dp[i-w[pos]/][]+v[pos],dp[i][]);
if(i>=w[pos])
dp[i][]=max(dp[i-w[pos]][]+v[pos],dp[i][]);
}
for(int i=V;i>=w[pos];i--)
dp[i][]=max(dp[i-w[pos]][]+v[pos],dp[i][]);
}
void solve(int T) {
init(); int n,l;
scanf("%d %d",&n,&l);
l<<=;
long long ans=;
for(int i=;i<=n;i++) {
scanf("%lld %lld",&w[i],&v[i]);
w[i]<<=;
ans=max(ans,v[i]);
}
for(int i=;i<=n;i++) {
beibao(i,l);
}
ans=max(ans,max(dp[l][],max(dp[l][],dp[l][])));
printf("Case #%d: %lld\n",T,ans);
}
int main() {
int T;
scanf("%d",&T);
for(int i=;i<=T;i++) solve(i);
}
HDOJ5543 Pick The Sticks的更多相关文章
- [HDOJ5543]Pick The Sticks(DP,01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:往长为L的线段上覆盖线段,要求:要么这些线段都在L的线段上,要么有不超过自身长度一半的部分 ...
- The 2015 China Collegiate Programming Contest D.Pick The Sticks hdu 5543
Pick The Sticks Time Limit: 15000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- 2015南阳CCPC D - Pick The Sticks dp
D - Pick The Sticks Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description The story happened lon ...
- CDOJ 1218 Pick The Sticks
Pick The Sticks Time Limit: 15000/10000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others ...
- 2015南阳CCPC D - Pick The Sticks 背包DP.
D - Pick The Sticks Description The story happened long long ago. One day, Cao Cao made a special or ...
- UESTC 1218 Pick The Sticks
Time Limit: 15000/10000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status ...
- hdu 5543 Pick The Sticks(动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:给你一根长为m的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上 ...
- DP(01背包) UESTC 1218 Pick The Sticks (15CCPC C)
题目传送门 题意:长度为L的金条,将n根金棍尽可能放上去,要求重心在L上,使得价值最大,最多有两条可以长度折半的放上去. 分析:首先长度可能为奇数,先*2.然后除了两条特殊的金棍就是01背包,所以dp ...
- uestc oj 1218 Pick The Sticks (01背包变形)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
随机推荐
- 介绍Dynamics 365 Performance Center
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复257或者20170517可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- vmware 开启VM的硬件cpu虚拟化功能
物理机的cpu硬件虚拟化功能,通过开启bios中的设置,而vmware中创建的虚拟机也可以开启该特性,如下. 这样的话,就直接可以基于这些VM安装openstack计算节点.控制节点.网络节点了.
- RN开发中的报错以及告警
报错一: Attempted to transition from state `RESPONDER_INACTIVE_PRESS_IN` to `RESPONDER_ACTIVE_LONG_PRES ...
- Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)
本节讨论 Prometheus Operator 的架构.因为 Prometheus Operator 是基于 Prometheus 的,我们需要先了解一下 Prometheus. Prometheu ...
- 基本的CRUD操作
导入包---实体类------数据库连接----数据库操作----service层数据操作----网页对service层可视化实现 model package com.ij34.model; publ ...
- 使用VsCode自带的Emmet语法
新建html文件,保存之后,输入"!",按Tap(或Enter)键,自动生成HTML结构 标签只要直接输入标签名(不要输入<>),按Tap(或Enter)键自动生成完整 ...
- typora快捷键
目录 基础信息 常用快捷键 修改快捷键 基础信息 typora是一款极佳的markdown写作软件,编辑和预览两者合二为一,免费良心软件,推荐使用. 官网:https://www.typora.io/ ...
- Building Lambda Architecture with Spark Streaming
The versatility of Apache Spark’s API for both batch/ETL and streaming workloads brings the promise ...
- Linux删除隐藏文件
方法2.ls -a 查询隐藏文件 将后缀名为.swp的文件删除 rm -f .nginx.conf.swp 再次编辑文件不在出现提示警告!
- Linux运维基础
一.服务器硬件 二.Linux的发展史 三.Linux的系统安装和配置 四.Xshell的安装和优化 五.远程连接排错 六.Linux命令初识 七.Linux系统初识与优化 八.Linux目录结构 九 ...