【DP_背包专题】 背包九讲
这段时间看了《背包九讲》,在HUST VJUDGE上找到了一个题单,挑选了其中16道题集中做了下,选题全部是HDU上的题,大多是简单题。目前做了点小总结,大概提了下每道题的思路重点部分,希望以后回看回想时能有帮助。
题单:http://vjudge.net/contest/22694#overview
题单列表
HDU 1059、HDU 1114、HDU 1171、HDU 1203、HDU 1712、HDU 2159、
HDU 2191、HDU 2546、HDU 2602、HDU 2639、HDU 2844、HDU 3033、
HDU 3449、HDU 3466、HDU 3535、HDU 3810
题目分类
0-1 背包:HDU 1059、HDU 1203、HDU 2546、HDU 2602、HDU 3466
完全背包:HDU 1114
多重背包:HDU 1171、HDU 2191、HDU 2844
混合背包:HDU 3535
二维背包:HDU 2159
分组背包:HDU 1712、HDU 3033
有依赖背包:HDU 3449
背包问题变化:HDU 2639、HDU 3810
题目分析
HDU 1203:
0-1背包问题,直接套上两层循环即可。
注意需要将 dp[j - cost[i]] + val[i] 改为 dp[j - cost[i]] * val[i]。
HDU 2546:
0-1背包问题。
首先用5元买最贵的东西,然后剩下的做普通0-1背包即可。
HDU 2602:
0-1背包基础入门题。
需要注意的是,如果要求恰好装满背包则除dp[0]外所有都需要初始化为-∞,这样可以保证最终状态f[n]是恰好装满背包的状态最优解。
如果没要求背包恰好装满,只希望价格尽量大,此时应将整个dp数组初始化为0。
HDU 3466:
0-1背包问题。
给入物品要按照价格p和价格限制q对q - p进行从小到大排序。解释如下:
对任意两个物品,A:p1, q1 B:p2, q2。先选A,则至少需要剩余p1 + q2的容量才能将两个物品买下,而先选B则至少需要p2 + q1,如果p1 + q2 > p2 + q1,那么要选两个的话的就要先选A再选B,公式可换成q1 - p1 < q2 - p2,就按这样的方法排序最后的顺序就是最优的顺序。
HDU 1114:
完全背包入门问题。
本题求得是最小值,所以初始化时除dp[0] = 0外其余全部为+∞。
HDU 1059:
多重背包基本问题。
需要二进制优化下,不然会超时。
HDU 1171:
多重背包问题。
因为小的一方获得总价值最多为sum / 2,所以dp范围是0~sum/2。然后二进制优化下按照0-1背包做。
HDU 2191:
多重背包入门问题。
直接套背包九讲。
HDU 2844:
多重背包问题。
直接套背包九讲。注意二进制优化。
HDU 3535:
混合背包问题。
详细题解见:http://www.cnblogs.com/coredux/archive/2012/07/26/2610868.html
HDU 2159:
二维背包问题。
dp[i][j]表示忍耐度为i,且还可以杀j个怪时能获得的最大经验值。
HDU 1712:
分组背包入门问题。
直接套背包九讲。
HDU 3033:
分组背包变种问题。
普通分组背包是每组中最多取一件,这里是至少取一件。
dp[i][j]代表前i组容量为j的最大价值。由于一组里面有多个物品,所以状态转移可以是前一组少取一个,即dp[i - 1][p - cost[i][j]] + val[i][j],也可以是当前组之前去过的少取一种,即dp[i][p - cost[i][j]] + val[i][j]。
这里需要注意下两个情况的先后顺序,需要先进行当前组的比较再与前一组进行比较(即单纯的分组背包必选情况,特别的是物品有0花费的情况,0花费要先放在当前层,再放在上一层才不会买两次,即先买0花费的)。
注意初始化时除dp[0]一行外全部为-∞,因为是恰好从上一组转移到这一组。
HDU 3449:
依赖背包问题。
题中买相应物品必须买相应箱子,箱子即依赖。在做0-1背包时需要先将box的影响除去,即在做0-1背包前先dp2[j] = dp[j - box[i]],更新枚举起点即可。在0-1背包做完后将dp与dp2中的最优值放入dp中即可。
HDU 2639:
求0-1背包的第K大解。
对于一般的背包方程为f[i-1][v] = max( f[i-1][v], f[i-1][v - cost[i]] + val[i] ),因为要记录第K大解,我们必然要记录前K大的所有解。所以我们从有序队列f[i-1][v][1...K]和f[i-1][v - cost[i]][1...K] + val[i]两个序列合并且取前K大不重复值存入f[i][v][1...K]中。实现过程中可以做滚动数组优化。时间复杂度为O(VNK)。
HDU 3810:
0-1背包变种问题。
详细题解见:http://blog.csdn.net/woshi250hua/article/details/7609293
一点总结
个人认为背包九讲中最基础最重要的两个模型是0-1背包模型和完全背包模型,把这两个模型弄懂了多抠细节,后面的模型理解起来会轻松很多。
【DP_背包专题】 背包九讲的更多相关文章
- 背包九讲PDF
本资料仅限个人学习交流使用,不得用于商业用途. 背包九讲PDF:https://pan.baidu.com/s/17rTxMwCo9iSTOW77yucdXQ 提取码:xbqa
- My背包九讲——概述
文章目录 什么是背包问题 背包问题的分类 [第一讲 01背包问题](https://blog.csdn.net/qq_34261446/article/details/103705068) 第二讲 完 ...
- 背包九讲 && 题目
★.背包求方案数的时候,多重背包是不行的,因为产生重复的背包会有多种情况. ★.背包记录路径的时候,其实是不行的,因为更新了12的最优解,如果它依赖于6这个背包,然后你后面改变了6这个背包,就GG 1 ...
- POJ3260——The Fewest Coins(多重背包+完全背包)
The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...
- hdu 2844 混合背包【背包dp】
http://acm.hdu.edu.cn/showproblem.php?pid=2844 题意:有n种纸币面额(a1,a2,...an),每种面额对应有(c1,c2,...cn)张.问这些钱能拼成 ...
- POJ 3260 多重背包+完全背包
前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168 ...
- 【poj3260-最少找零】多重背包+完全背包
多重背包+完全背包. 买家:多重背包:售货员:完全背包: 开两个数组,分别计算出买家,售货员每个面额的最少张数. 最重要的是上界的处理:上界为maxw*maxw+m(maxw最大面额的纸币). (网上 ...
- 「kuangbin带你飞」专题十九 矩阵
layout: post title: 「kuangbin带你飞」专题十九 矩阵 author: "luowentaoaa" catalog: true tags: mathjax ...
- HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...
随机推荐
- mongodb 在windows上安装为服务
// mongo 也是先安装扩展 在安装为服务 首先 先下载mongodb的压缩包 解压(一个bin文件夹 三个文件) 在目录下 新建立一文件夹 mongodb 然后将解压的内容放进去 然后在mong ...
- GridControl 复合表头(多行标题)
说明: 最好是通过编辑视图进行设计,后台编码有点麻烦. 例图:(上面的GC是后台编写 ,下面的是设计器设计) 后台代码编写: public void InitCtrl() { DevExpress.X ...
- CAS 之 集成RESTful API
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Android 定时任务高度【schedule】与【scheduleAtFixedRate】差别
在android中调度定时任务有两种方法 1.schedule 2.scheduleAtFixedRate 这两种方法的差别在于 首次调用时间(Date when)这个參数 <span styl ...
- 【02】尽量以const,enum,inline替换#define
1.考虑为什么? 首先,#define不是语言的一部分,而是预编译过程.也就是在编译器编译之前,进行文本替换.考虑#define Pi 3.1425:在编译之前,Pi都会被文本替换为3.1415,因此 ...
- [转]Compact Normal Storage for Small G-Buffers
http://aras-p.info/texts/CompactNormalStorage.html Intro Baseline: store X&Y&Z Method 1: X&a ...
- linux学习之八---Linux进程基础知识
一.linux进程 linux是一个多用户多任务的操作系统. 多用户是指多个用户能够在同一时间使用计算机. 多任务是指linux能够同一时候运行几个任务. 进程简单来说就是执行中的程序,Linux系统 ...
- ubuntu12.04的vim配置
ubuntu12.04中使用的vim的版本不支持像语法高亮和文件类型检测等配置 #sudo apt-get install vim vim默认的配置使用起来还不能让人满意,还需要自己配置默认配置文件是 ...
- jfinal-QuartzPlugin后台任务调度
配置方法: 1. 在jfinal的Start.java中插件位置配置QuartzPlugin /** * 配置插件 */ public void configPlugin(Plugins me) { ...
- linux 内核---------董昊 ( Robin Dong ) and OenHan
http://oldblog.donghao.org/ http://blog.donghao.org/%E6%97%A7%E5%8D%9A%E5%AE%A2/ http://blog.donghao ...