01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻。

01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?

题目描述:

有编号分别为a,b,c,d,e的五件物品,它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,如何让背包里装入的物品具有最大的价值总和?

name weight value 1 2 3 4 5 6 7 8 9 10
a 2 6 0 6 6 9 9 12 12 15 15 15
b 2 3 0 3 3 6 6 9 9 9 10 11
c 6 5 0 0 0 6 6 6 6 6 10 11
d 5 4 0 0 0 6 6 6 6 6 10 10
e 4 6 0 0 0 6 6 6 6 6 6 6

只要你能通过找规律手工填写出上面这张表就算理解了01背包的动态规划算法。

首先要明确这张表是至底向上,从左到右生成的。

为了叙述方便,用e2单元格表示e行2列的单元格,这个单元格的意义是用来表示只有物品e时,有个承重为2的背包,那么这个背包的最大价值是0,因为e物品的重量是4,背包装不了。

对于d2单元格,表示只有物品e,d时,承重为2的背包,所能装入的最大价值,仍然是0,因为物品e,d都不是这个背包能装的。

同理,c2=0,b2=3,a2=6。

对于承重为8的背包,a8=15,是怎么得出的呢?

根据01背包的状态转换方程,需要考察两个值,

一个是f[i-1,j],对于这个例子来说就是b8的值9,另一个是f[i-1,j-Wi]+Pi;

在这里,

f[i-1,j]表示我有一个承重为8的背包,当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值

f[i-1,j-Wi]表示我有一个承重为6的背包(等于当前背包承重减去物品a的重量),当只有物品b,c,d,e四件可选时,这个背包能装入的最大价值

f[i-1,j-Wi]就是指单元格b6,值为9,Pi指的是a物品的价值,即6

由于f[i-1,j-Wi]+Pi = 9 + 6 = 15 大于f[i-1,j] = 9,所以物品a应该放入承重为8的背包

以下是actionscript3 的代码

     public function get01PackageAnswer(bagItems:Array,bagSize:int):Array{var bagMatrix:Array=[];var i:int;var item:PackageItem;for(i=0;i<bagItems.length;i++){bagMatrix[i] = [0];}for(i=1;i<=bagSize;i++){for(var j:int=0;j<bagItems.length;j++){item = bagItems[j] as PackageItem;if(item.weight > i){//i背包转不下itemif(j==0){bagMatrix[j][i] = 0;}else{bagMatrix[j][i]=bagMatrix[j-1][i];}}else{//将item装入背包后的价值总和var itemInBag:int;if(j==0){bagMatrix[j][i] = item.value;continue;}else{itemInBag = bagMatrix[j-1][i-item.weight]+item.value;}bagMatrix[j][i] = (bagMatrix[j-1][i] > itemInBag ? bagMatrix[j-1][i] : itemInBag)}}}//find answervar answers:Array=[];var curSize:int = bagSize;for(i=bagItems.length-1;i>=0;i--){item = bagItems[i] as PackageItem;if(curSize==0){break;}if(i==0 && curSize > 0){answers.push(item.name);break;}if(bagMatrix[i][curSize]-bagMatrix[i-1][curSize-item.weight]==item.value){answers.push(item.name);curSize -= item.weight;}}return answers;}

转载于:https://www.cnblogs.com/szj-lxl/p/6684518.html

动态规划之01背包问题(最易理解的讲解)相关推荐

  1. 背包问题动态规划matlab,01背包问题动态规划详解

    计算机算法分析考试:动态规划0-1背包问题,怎么算她说她没醉,却一直摇摇晃晃掉眼泪:你说你爱她,却从未想过给她一个家. 要考试了,老师给划重点有一题:动态规划0-1背包问题,怎么算. 怎么理问题描述: ...

  2. 经典动态规划:0-1 背包问题

    经典动态规划:0-1 背包问题 文章目录 经典动态规划:0-1 背包问题 一.题目描述 二.动规标准套路 三.题目描述 四.解法分析 五.优化 一.题目描述 就讨论最常说的 0-1 背包问题,简单描述 ...

  3. o-1背包问题迭代_经典动态规划:01背包问题的变体

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 上篇文章 经典动态规划:0-1 背包问题 详解了通用的 ...

  4. 0-1背包问题 动态规划java_C#使用动态规划解决0-1背包问题实例分析

    // 利用动态规划解决0-1背包问题 using System; using System.Collections.Generic; using System.Linq; using System.T ...

  5. 动态规划解决0-1背包问题详解(图文并茂)

    动态规划解决0-1背包问题 这个是网上比较好的案例,因为原文有些地方晦涩难懂,对于刚接触动态规划问题的朋友来说很不友好,所以很对地方加入了我自己的见解,也是作为我的一次学习历程. 一.问题描述: 有n ...

  6. 01背包问题:图表法带你快速理解动态规划解决01背包问题 附C++源码

    0-1背包问题 所谓0-1背包问题,也就是给你一个重量为M的背包和n种物品,每种物品有一定的重量和价值,在每种物品均可装入背包1次或不装入(不能仅装入物品的一部分)且不超过背包载重量的前提下,问你怎样 ...

  7. 动态规划专题 01背包问题详解【转】

    对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本 ...

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

    满篇都是干货,有详细的注释和代码,请放心观看. 这就是传说中的 01 背包问题,这个问题看到之后主要有两种思路: 一.贪心做法(错误想法) 这道题如果没有学过 01 背包问题的话,很容易想成一个贪心的 ...

  9. 题目1025:最大报销额(动态规划之01背包问题)

    题目1025:最大报销额 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5270 解决:1272 题目描述: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具 ...

  10. 【动态规划】01背包问题(c++代码逐句分析)

    01背包问题是一个经典的动态规划问题,不过并不适合作为动态规划的入门训练,适合作为一个动态规划的进阶训练题.如果你在此前从未接触过动态规划,那么建议先点个收藏,在学习了动态规划的相关知识点并且做了一些 ...

最新文章

  1. 谈谈 ES6 的 Promise 对象
  2. Java 11就在这里,您准备好进行切换了吗?
  3. [转]何时使用委托而不使用接口(C# 编程指南)
  4. 查看windows所有exe的启动参数。
  5. linux查看usb文件,linux下查看usb个数
  6. RTLviewer与TechnologyMapViewer的区别?
  7. php 计算字段的和,php – foreach中计算列的总和
  8. 前端菜鸟浅谈Web前端开发技术
  9. Linux下MinDoc安装使用
  10. chrome谷歌浏览器使用技巧
  11. win10的计算机用户名怎么改,win10账户名修改,教您win10怎么更改账户名称
  12. 使鼠标保持按住状态_程序猿、设计狮们的钟爱鼠标品牌,你知道是什么吗?
  13. 个人博客网站搭建-WordPress-NameSilo-云左虚拟主机
  14. ArcGIS使用(一)创建ArcGIS应用
  15. iOS开发中常用的方法
  16. tinyint(1)和int(1)的区别
  17. java后台 重置手机密码(邮箱点击确认)
  18. 华科计算机博导刘云生论文,华科论文式要求.doc
  19. css矩形外发光,CSS3 实现发光边框特效
  20. MyZip Pro 1.2.4 中文版 多线程解压缩软件

热门文章

  1. XenServer 6.5实战:Creating a Storage Repository (CIFS)
  2. Weka数据挖掘平台
  3. Python Tutorial 实践(2)
  4. 如何获取屏幕分辨率呢
  5. java gbk文件转utf8_java 将GBK编码文件转为UTF-8编码
  6. 用python写个小游戏难吗_小伙用Python制做一个小游戏,结果6秒就结束,怎么难玩?...
  7. 把Unity的jdk环境添加到环境变量
  8. [转载]Spring Boot Actuator 使用
  9. 【渝粤教育】电大中专学习指南 (2)作业 题库
  10. 【渝粤教育】电大中专建筑施工技术 (2)作业 题库