动态规划法—0-1背包问题(二)

问题的描述

  假如我们用C表示最大价值,那么C[n,W]就表示n个物品,在背包容量为W时,背包的最大价值。

在求这个最大价值之前,我们可能会考虑某一子问题的最大价值,用C[i,w]表示,意思是该子问题中,有i个物品,背包的最大容量为w时的最大价值。

三种情况

  • 情况1:假如这个子问题中,i=0或w=0,那么c[i,w]=0。
  • 情况2:假如在该子问题中,在i个物品当中,有的物品根本就装不进背包(该物品的wi>w),那么根本就谈不到它在背包价值大的还是不在背包价值大,所以直接将该子问题转化成c[i-1,w],即有i-1个物品,容量为w时的最大价值。(注:wi中的角标i和i是含义上是不一样的,教材上在程序实现过程中会把这两个i当成一样的)
  • 情况3:假如在这个子问题中,在i个物品当中,有几个物品是能够装入背包的,但是不知道它该不该在背包里。那么对于这种情况就运用上一篇文章写的动态规划方法来解决。(所以我们总是在几个可选项中,决定谁应该选中的情况下,使用动态规划方法)。

    按照上篇文章所说,对于情况3,我们先拿出任意一个可选物品考虑它在不在背包里面。

    在背包里的总价值:c[i-1,w-wi]+vi

    不在背包里的总价值:c[i-1,w]

    i-1表示可选物品中,剩下的待考虑的物品个数。

动态规划法的实施

  现在,结合具体问题来说明。

物品编号 1 2 3 4 5
重量 3 4 7 8 9
价值 4 5 10 11 13

  举个例子说明。现在背包容量为4,所以要求的问题就是c[5,4],现在我假如要考虑物品4是不是进背包,发现w4>4,属于第二种情况,所以我们求解的问题转化成c[5-1,4](c[4,4])的问题,这里可以看出来,i和wi是不一样的。我们书上一样是因为,每次都按5,4,3,2,1的顺序考虑。接着我们考虑物品5,那么w5>w,所以问题由刚才的c[4,4]变成了c[4-1,4]的问题(c[3,4])。同理,当你考虑物品3的时候,也是这样。

  更直接地说,因为当背包容量为5时,因为就两个可选的物品,物品1和物品2,所以我们要求解的问题c[5,4]就可以转化成c第三种情况的[2,4]的问题,这时如果我们先考虑1在不在背包里,就是c[2-1,4-3]+4和c[2-1,4]即c[1,1]+4和c[1,4]。然后在分别对两种情况下的子问题,考虑物品2在背包里。对于c[1,1]这个子问题,物品4放不进去,该子问题就转换成c[0,1]这个子问题,这个子问题可以直接算出解为0;对于c[1,4]这个子问题,物品2在不在背包里面就是c[0,0]+5和c[0,4]。

c[5,4]->c[4,4]->c[3,4]->c[2,4]->Max(c[1,1]+4,c[1,4])

  按上述顺序求解,如图所示:

  现在来解决背包容量为17的问题,从背包容量为0的时候开始考虑。见下面4张表:

表1表示在背包容量为某个值时,可选项和不可选项。

表2表示按物品单位价值比由高到低的顺序考虑问题的最优解。

表3表示按物品重量由大到小的顺序考虑。

表4表示按物品单位价值比由低到高的顺序考虑。

总结

  在上述问题中,我们可以发现,当背包容量为0时,问题属于情况1;容量为1-8时,问题最初属于情况2;容量为9-17时,问题最初属于情况3。而且,通过三个表格的对比,我们发现问题的最优解和我们按何种顺序考虑是没有关系的,最终求得的最优解和最大价值都是一样的。

时间: 2024-10-18 11:41:01

动态规划法—0-1背包问题(二)的相关文章

0/1背包问题的动态规划法求解 —— Java 实现

0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进对动态规划法机制的理解和掌握. 值得提及的一个问题是,在用 JAVA 实现时, 是按算法模型建模,还是用对象模型建模呢? 如果用算法模型,那么 背包的值.重量就直接存入二个数组里:如果用对象模型,则要对背包以及背包问题进行对象建模.思来想去,还是采用了对象模型,尽管心里感觉算法模型似乎更好一些.有时确实就是这样,对象模型虽然现在很主流,但也不是万能的,采用

动态规划法-01背包问题

一 几个概念: 最优化问题:有n个输入,它的解由这n个输入的一个子集组成,这个子集必须满足某些事先给定的条件,这些条件称为约束条件,满足约束条件的解称为问题的可行解.满足约束条件的可行解可能不止一个,为了衡量这些可行解的优劣,事先给出一定的标准,这些标准通常以函数的形式给出,这些标准函数称为目标函数,使目标函数取得极值的可行解成为最优解,这类问题称为最优化问题. 二 最优性原理: 对于一个具有n个输入的最优化问题,其求解的过程往往可以划分为若干个阶段,每一个阶段的决策仅依赖前一阶段的状态,由决策

背包问题:0/1背包问题 普通背包问题(贪心算法只适用于普通背包问题)

//sj和vj分别为第j项物品的体积和价值,W是总体积限制. //V[i,j]表示从前i项{u1,u2,…,un}中取出来的装入体积为j的背包的物品的最大价值. 第一种:0/1背包问题 最大化 ,受限于  1)若i=0或j=0,  V[i,j] = 0 2)若j<si, V[i,j] = V[i-1,j] 3)若i>0且j>=si, V[i,j] = Max{V[i-1,j],V[i-1,j-si]+vi} 第二种:背包问题:在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部

EF6.0+APS.NET MVC5.0项目初探二(类库引用关系及说明)

接着上一篇(EF6.0+APS.NET MVC5.0项目初探一(界面展示),说说我搭建项目的一点心得. 第一步:我喜欢先建一个空的解决方案,只是个人喜好,不喜勿喷,呵呵. 如图: 第二步:添加项目所需要的类库: 如图: 第三步:添加类库引用 UI.Manage->BusinessLogic.BLL,Domain.Entity,Domain.ViewModel,Infrastructure.Common,UI.HtmlHelper BusinessLogic.BLL->Domain.Entity

0/1背包问题(回溯法)

回溯法是一个既带有系统性又带有跳跃性的搜索算法.它在包含问题的所有解的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一结点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树搜索,逐层向其祖先结点回溯:否则 ,进入该子树,继续按深度优先策略搜索. 问题的解空间 用回溯法解问题时,应明确定义问题的解空间.问题的解空间至少包含问题的一个(最优)解.对于 n=3 时的 0/1 背包问题,可用一棵完全二叉树表示解空间,如图所示: 求解步骤 1)针对所

动态规划算法实现部分——0/1背包问题

代码: import java.util.*; import java.util.Scanner; /* *动态规划思想解决0/1背包问题 */ public class Main{ public static void main(String[] args){ Scanner in=new Scanner(System.in); System.out.println("输入背包的容量"); int bagCap=in.nextInt(); //背包的容量 System.out.pri

动态规划算法求解0,1背包问题

首先我们来看看动态规划的四个步骤: 1. 找出最优解的性质,并且刻画其结构特性: 2. 递归的定义最优解: 3. 以自底向上的方式刻画最优值: 4. 根据计算最优值时候得到的信息,构造最优解 其中改进的动态规划算法:备忘录法,是以自顶向下的方式刻画最优值,对于动态规划方法和备忘录方法,两者的使用情况如下: 一般来讲,当一个问题的所有子问题都至少要解一次时,使用动态规划算法比使用备忘录方法好.此时,动态规划算法没有任何多余的计算.同时,对于许多问题,常常可以利用其规则的表格存取方式,减少动态规划算

poj 2155 二进制0 1反转---二维树状数组

http://poj.org/problem?id=2155 上午自己搞了很久胡思乱想了很久,然后没思路-----看了论文<浅谈信息学竞赛中的"0"和"1"--二进制思想在信息学竞赛中的应用>,豁然开朗啊,,马上A掉---PE了一次o(╯□╰)o 通过论文学到的两点: 1.多维不会的时候,从一维尝试类比: 2.想法的证明,情况数不多的时候,分类讨论证明很好 #include <cstdio> #include <cstring>

NPOI 2.0 教程(二):编辑既存的EXCEL文件

NPOI 2.0 教程(二):编辑既存的EXCEL文件 分类: C#技术 2014-03-11 15:40 993人阅读 评论(3) 收藏 举报 c#excelNPOI 转载请注明出处 http://blog.csdn.net/fujie724 上一篇中讲了用NPOI创建新EXCEL文件的基本方法,但有时候我们需要的是对一个已有的EXCEL文件进行编辑修改.那么用NPOI该怎么做呢? 请接着学习 在这一篇里,我们读入上一篇教程中生成的EXCEL,然后以其做为模版,修改之后保存为另一份EXCEL

SD3.0协议解读二

在阅读本文章之前,请先思考一下什么是总线,总线的作用是什么?相信大家都学过I2C总线,它由SCL和SDA两条线组成,通过这两条线就能完成各种通信.同样地,SD卡通信也需要有自己的总线模式.SD卡还比较牛逼,支持SD总线和SPI总线,老衲接触的比较多的是SD总线,所以这篇文章仅介绍SD总线,对于SPI总线老衲以后有机会再介绍. SD总线: 大家都知道总线一般支持多种频率,在默认的频率下,SD总线支持一(主)对多(从)的模式,即支持一个HOST对多个SD卡的模式.但是,在高速和UHS-I,SD总线只