0/1背包

  • 一、0/1背包问题
    • 1.实例讲解
    • 2.DP求解0/1背包
    • 3.输出0/1背包方案
  • 二、0/1背包题目代码(持续更新)

一、0/1背包问题

给定n种物品和一个背包,物品i的重量为wi,价值为vi,背包的总容量为C。
在入背包的物品时对每种物品i只有两种选择,即装入背包和不装入背包(称为0/1背包),如何选择装入背包的物品使得背包中物品总价值最大?

xi = 0时不装入背包,xi = 1时装入背包:

约束条件:装入背包的物品重量之和不超过背包总容量

目标函数:装入背包的物品价值之和最大

1.实例讲解

有四个物品,重量分别为2,3,6,5,价值分别为6,3,5,4,背包的容量为9。

B(k,c),k代表前k个物品,c代表背包剩下的容量
例如B(2,9):背包剩下的容量是9时还有2个物品

公式推导
假设现在背包里已经有前两个物品,背包容量为0,这时想放第三个物品,发现重量w3太重大于背包容量c,已经放不下,则B(k-1,c)

那么现在假设背包容量足够大,可以放下第j个物品,我们可以有两个选择,放/不放。
放进去:B(k-1,c-cj)+vj(c-cj:背包剩余容量再减去物品重量,vj是物品价值)
不放进去:B(k-1,c)

故公式:

2.DP求解0/1背包

建立一个二维表dp[][],行数为n+1,列数为C+1。
行数和列数都要加1是因为有一行和一列比较特殊,即背包容量为0和不装物品的情况。
所以一般从dp[1][1]开始填入数据

  1. 步骤一:只装第1个物品
    由于物品1的重量是2,所以背包容量c小于2的都放不进去,dp[1][1]=0;
    从dp[1][2] 开始填入第一个物品的价值v1=6


此时dp[1][2]的结果是可由公式计算出来的,B(0,0)和B(0,2)查表可知都是0,因为选择的结果最大所以填入6。

2. 第二步:装其他物品
这个时候直接用公式同上代入数据即可,最后的答案是dp[4][9],即把4个物品装到容量为9的背包,最大价值11.

3.输出0/1背包方案

具体看装了哪些物品,需要倒过来观察。
dp[4][9] = max{dp[3,4]+4(选了物品4的情况),dp[3][9](不选物品4的情况)} = dp[3][9],最大的为不选物品4的情况,说明没有选物品4。
dp[3][9] = max{dp[2,3]+5,dp[2][9]}=dp[2][3]+5=11,说明选了物品3,。
dp[2][3] = max{dp[1,0]+3,dp[1][3]}=dp[1][3],说明没选物品2,。
dp[1][3] = max{dp[0,1]+6,dp[0][3]}=dp[0][1]+6=6,说明选了物品1。

也就是说只要判断所填的值dp[i][j]是等于dp[i-1][j-ni]+vi还是dp[i-1][j],就知道有没有选择第i个物品了。

二、0/1背包题目代码(持续更新)

HDOJ 2602-Bone Collector.:0/1背包模板代码(含输出模板以及滚动数组

动态规划(五)——0/1背包相关推荐

  1. 实验3 动态规划(0/1背包)

    1.问题给定的已知 N种物品和一个背包,物品的种类为wi,价值为vi,背包容量为C 2.所求目标 如何选择装入背包的物品,使得物品的总价值最大 3.数学模型 4.最优质子结构分析 现将问题分为n个子问 ...

  2. 动态规划算法初步(6)——0/1 背包

    动态规划算法初步(6) 例题五:0/1 背包(背包型) 题目: 一个旅行者有一个最多能装m公斤物品的背包,现在有n件物品,它们的重量分别是w1,w2,-,wn,它们的价值分别为c1,c2,-,cn.若 ...

  3. Python 0/1背包、动态规划

    参考:http://www.cnblogs.com/fcyworld/p/6243012.html Python 0/1背包.动态规划 0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同 ...

  4. 动态规划之背包问题——01背包

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...

  5. 【动态规划】0/1背包问题

    问题 H: [动态规划]0/1背包问题 时间限制: 1 Sec  内存限制: 64 MB 提交: 152  解决: 95 [提交] [状态] [讨论版] [命题人:admin] 题目描述 张琪曼和李旭 ...

  6. HDOJ 2602-Bone Collector(0/1背包模板、打印方案及滚动数组解法)

    0/1背包 一.Bone Collector 解法一:二维数组解法(0/1背包模板代码) 1.1 0/1背包打印方案代码 解法二:滚动数组(一维)解法 2.1 一维滚动数组例题 E-爱玩游戏的Tom ...

  7. 动态规划之背包问题 01背包

    什么是01背包? 有n件物品和一个最多能背重量为w 的背包.第i件物品的重量是weight[i],得到的价值是value[i] .每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大. 首先, ...

  8. 夜深人静写算法(十五)- 完全背包

    文章目录 一.前言 二.完全背包问题 1.状态设计 2.状态转移方程 3.对比 0/1 背包问题 4.时间复杂度分析 三.完全背包问题的优化 1.时间复杂度优化 2.空间复杂度优化 3.优化后的代码实 ...

  9. 动态规划总结(01背包 完全背包 多重背包)

    动态规划总结(01背包 完全背包 多重背包) 一.学习资料 1.UVA DP 入门专题 2.夜深人静写算法(二) - 动态规划 3.算法之动态规划 4.什么是动态规划?动态规划的意义是什么? 5.01 ...

最新文章

  1. ViewTreeObserver
  2. 阿里面试官给你的一些忠告,这样做肯定错不了!附视频
  3. vue2.0项目结构和打包发布
  4. cygwin的安装使用
  5. day01初步接触python和环境的安装
  6. [Node.js]操作mysql
  7. ORA-01113问题的简单分析
  8. java编程找异数,异类Outliers_又名异数Malcolm_Gladwell.pdf
  9. JFreechart从入门到放弃
  10. 智通标书制作系统 5.1
  11. Emoji表情存入数据库报错:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F…'
  12. 你知道腾讯程序员一年写多少代码嘛?
  13. WPCMS插件自动采集发布文章WordPress插件
  14. 科目二练习与考试点位总结
  15. Eclipes和Myeclipse插件安装方法
  16. vue 调用语音播放
  17. TechEd 2006 微软揭开SharePoint 2007 新特性LOBi
  18. matlab求解拉普拉斯方程,急求用matlab编写解拉普拉斯方程的程序
  19. 电池最耐用 android,聊聊手机几年一换最合适,安卓机用三年最不划算
  20. Google AdWords: Intermediate Techniques Google AdWords:中级技术 Lynda课程中文字幕

热门文章

  1. Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决...
  2. IOS 创建简单表视图
  3. 绝对定位的div的居中方法,下面的写法兼容IE系列浏览器和火狐浏览器。
  4. 项目管理:项目经理要具备的技能
  5. 瑞星杀毒全面免费 请下载
  6. NodeJS 正则路由匹配
  7. Python_多线程编程
  8. IE CSS Bug及解决方案参考手册
  9. 获取mysql 时钟,员工时钟的MySQL数据库结构
  10. 如何在PHP里面连接数据库?