`
lingyibin
  • 浏览: 196239 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

完全背包问题

阅读更多

看这篇日志之前,请先阅读我的上一篇日志,关于0/1背包的问题。

完全背包问题的描述:

有N 种物品和一个容量为V 的背包,每种物品都有无限件可用。第i 种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

可能大家已经看出来了,完全背包问题其实就是在0/1背包的问题的基础上加了一个条件:每种物品都有无限件可用。

这个问题有不少解法,下面只给出最优化的O(VN)的算法。
这个算法使用一维数组,先看伪代码:
for i=1..N
for v=0..V
f[v]=max{f[v],f[v-cost]+weight}


你会发现,这个伪代码与01背包的伪代码只有v 的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么01背包中要按照v=V..0的逆序来循环。这是因为要保证第i次循环中的状态f[i][v]是由状态f[i-1][v-c[i]]递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i 件物品”这件策略时,依据的是一个绝无已经选入第i 件物品的子结果
f[i-1][v-c[i]]。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果f[i][v-c[i]],所以就可以并且必须采用v=0..V的顺序循环。这就是这个简单的程序为何成立的道理。值得一提的是,上面的伪代码中两层for循环的次序可以颠倒。这个结论有可能会带来算法时间常数上的优化。
这个算法也可以以另外的思路得出。

例如,将基本思路中求解f[i][v-c[i]]的状态转移方程显式地写出来:

f[i][v]=max{f[i-1][v],f[i][v-c[i]]+w[i]}

把[i-1]和[i] 都去掉,就可以得到f[v]=max{f[v],f[v-c[i]]+w[i]}。为什么可以去掉呢。看一下上一篇日志中的这个图



 
你会发现,我们用二维数组 的解法做的时候,都是扣掉 当前的容量所剩下的容量最多能放多少,取的是上一行的数据: f[i-1][v],这是因为在当前背包加入的之前,上一行就表示出了 加入上一个背包时的最优解。而其实每一行都比上一行优化,因为每往下走一行,就加入了一个背包,比原来的选择多,得出的优化值自然比上一行的优化。

知道了每一行都比上一行优化之后 ,完全背包问题的答案就可以得出来了,我们每次都取当前行,即f[i][v],那么原状态方程就变成了:f[i][v]=max{f[i][v],f[i][v-c[i]]+w[i]},呵呵,二维数组的第一维都变成i了,就是说都在同一行进行比较了。这样的话就可以把它转化成一维数组问题了。即,直接把[i]去掉。。。

最后抽象出处理一件完全背包类物品的过程伪代码:
procedure CompletePack(cost,weight)
for v=cost..V
f[v]=max{f[v],f[v-c[i]]+w[i]}

 

上传了一个参考文档,有兴趣的同志可以自己去看看

 

  • 大小: 26.1 KB
分享到:
评论
1 楼 javafound 2011-03-30  
图片毛出来啊

相关推荐

    95、1268:【例9.12】完全背包问题(2020.03.19)A.pdf

    完全背包问题是一类典型的动态规划问题,在计算机科学和算法设计领域中有着广泛的应用。它和0-1背包问题类似,都需要在限定的背包容量内,选择物品装入背包以获得价值的最大化,不同的是,完全背包问题中每个物品...

    动态规划 完全背包问题.cpp

    动态规划之完全背包问题。 完全背包是在N种物品中选取若干件(同一种物品可多次选取)放在空间为V的背包里,每种物品的体积为C1,C2,…,Cn,与之相对应的价值为W1,W2,…,Wn.求解怎么装物品可使背包里物品总价值...

    完全背包问题实验详细c语言代码

    详细的完全背包问题1的C语言代码

    基于线性规划的二重约束完全背包问题c++

    基于线性规划解决二重约束完全背包问题,c++代码。实现功能: 输入: 1、背包容量V质量M和物品数量n 2、//每个物品的容量v[i]和质量m[i] 输出: 最大value

    01背包,部分背包,完全背包问题.docx

    在01背包问题中,贪心策略可能无法得到全局最优解,但在部分背包或完全背包问题中,如果物品的单位价值一致或递增,贪心算法能保证找到最优解。 【性能比较】 题目中通过一个规模较大的实例比较了动态规划、回溯法...

    完全背包问题的三种算法的java实现

    背包问题九讲中的完全背包问题的三种算法的具体java实现代码。

    完全背包问题.docx

    完全背包问题是一个经典的动态规划问题,它涉及到在有限的资源约束下最大化收益的决策过程。在这个问题中,有一个旅行者需要在限定的背包重量限制下选择物品,目标是使背包中物品的总价值达到最大。 实验目的主要是...

    完全背包问题.md

    完全背包问题.md

    基于C++的完全背包问题(.cpp)

    基于C++的完全背包问题(.cpp)

    背包之01背包、完全背包、多重背包详解.

    完全背包问题与01背包类似,但物品可以无限重复使用。这意味着对于每个物品,我们可以选择放入0个、1个、2个,甚至无限个,只要它们的总重量不超过背包的容量。完全背包的状态转移方程与01背包略有不同,需要考虑...

    背包问题九讲(01背包,多重背包,完全背包等)

    完全背包问题与01背包的主要区别在于,每个物品可以被取走任意次,只要不超过背包的容量。这个问题同样可以通过动态规划求解,状态转移方程与01背包类似,但不需要考虑物品是否被选中的情况,因为完全背包中每个物品...

    完全背包_背包问题_容量为c的背包_背包_完全背包_4321_

    完全背包问题N件物品放入容量为C的背包。第i件物品的费用(重量、体积等)为wi,价值为vi。每件物品可以取用任意多次(无限数量),选择将哪些物品放入背包令总费用不超过背包的容量且物品的价值总和最大。输入格式...

    背包问题(0-1背包,完全背包,多重背包知识概念详解)

    完全背包问题的解决方案通常比0-1背包问题简单,因为不需要考虑物品的限制次数。 最后,多重背包问题可以看做是0-1背包与完全背包的混合体。在这个问题中,每种物品有一定的数量限制,即每种物品最多可以选择n[i]件...

    背包问题可视化

    【背包问题可视化】是一种在计算机科学中用于解决优化问题的经典算法,主要应用于资源分配和决策制定。这个项目是基于.NET框架实现的,并且利用ASP.NET技术进行可视化展示。通过使用`asp:table`控件,开发者创建了一...

    背包问题9讲

    2. 完全背包问题:在完全背包问题中,每种物品可以使用无限次,这使得问题的求解方法与01背包问题不同。完全背包问题可以采用贪心策略来解决,也可以用动态规划的方法来求解更复杂的情况。 3. 多重背包问题:多重...

    背包问题数据集

    背包问题,作为运筹学和计算机科学领域中的一个经典优化问题,已存在多种变体,而多维背包问题尤其在近年来因其实际应用的广泛性而备受关注。它不仅涉及单一的重量限制,还可能包含多个维度的限制,如体积、能耗等。...

Global site tag (gtag.js) - Google Analytics