`

【算法导论】0-1背包问题 与 部分背包

 
阅读更多

【0-1背包】 问题描述:n件物品,第i件物品价值 v[i] 元,重w[i] 磅。希望用 W磅的书包 拿走总价值最贵的物品。(物品不可以分割故称为0-1背包)

【部分背包】问题描述:n件物品,第i件物品价值 vi 元,重wi 磅。希望用 W磅的背包 拿走最重的物品。第i件物品可以都拿走,也可以拿走一部分。(物品可以分割所以称为部分背包)


注意:0-1背包不能用贪心算法求解。

原因:按照贪心算法,每一次拿的都是每磅最贵的物品。由于物品大小不同,有可能每磅最贵的不是最合适大小的。最坏的情况可能导致,背包没有装满,而且当前装的也不是最优的。

例如:10磅 A 价值60¥ ; 20磅 B 价值100¥;30磅 C 价值120¥; 背包重50磅

按照贪心算法 ,应该选择 A B (160¥) 但是最优的应该是 BC(220¥)

分析:没有装满的背包降低了平均每磅物品的价值,将物品装入时必须考虑

1)装入物品i后子问题的解

2)不装入物品i后子问题的解哪个最优。

这样导致了许多子问题重叠,而这又恰巧是动态规划特点。

部分背包,显而易见可以用贪心算法。

【0-1背包】问题描述:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。所谓0-1背包,表示每一个物品只有一个,要么装入,要么不装入。

二, 解决方案:
考虑使用动态规划(dynamic programming)问题求解,定义一个递归式 opt[i][v] 表示前i个物品,在背包容量大小为v的情况下,最大的装载量。
opt[i][v] = max(opt[i-1][v] , opt[i-1][v-c[i]] + w[i])
解释如下:
opt[i-1][v] 表示第i件物品不装入背包中,而opt[i-1][v-c[i]] + w[i] 表示第i件物品装入背包中。

花费如下:
时间复杂度为o(V * T) ,空间复杂度为o(V * T) 。 时间复杂度已经无法优化,但是空间复杂度则可以进行优化。但必须将V 递减的方式进行遍历,即V.......0 的方式进行。

三,初始化:
(1)若要求背包必须放满,则初始如下:
f[0] = 0 , f[1...V]表示-INF。表示当容积为0时,只接受一个容积为0的物品入包。
(2)若要求背包可以空下,则初始化如下:
f[0...V] = 0 ,表示任意容积的背包都有一个有效解即为0。
具体解释如下:
初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。
如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,
其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。
如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,
这个解的价值为0,所以初始时状态的值也就全部为0了。

四,代码如下:

/*
01背包,使用了优化后的存储空间
建立数组

f[i][v] = max(f[i-1][v] , f[i-1][v-c[i]] + w[i])
将前i件物品,放入容量为v的背包中的最大值。


下面介绍一个优化,使用一维数组,来表示
(1) f[v]表示每一种类型的物品,在容量为v的情况下,最大值。
但是体积循环的时候,需要从v----1循环递减。


初始化问题:
(1)若要求背包中不允许有剩余空间,则可以将f[0]均初始化为0,其余的f[1..n]均初始化为-INF 。
表示只有当容积为0 的时候,允许放入质量为0的物品。
而当容积不为0的情况下,不允许放入质量为0的物品,并且把状态置为未知状态。



(2)若要求背包中允许有剩余空间 ,则可以将f[1n],均初始化为0。
这样,当放不下去的时候,可以空着。
*/





分享到:
评论

相关推荐

    算法工程 0-1背包问题

    0-1背包问题是一种经典的组合优化问题,在计算机科学和算法设计中有着广泛的应用。这个问题源自于实际生活中的装箱问题,比如有限空间的行李箱如何装入价值最大的物品。0-1背包问题的特点是每种物品只能选择放入背包...

    算法导论章节答案(31~35章)

    3. 背包问题:包括0-1背包和完全背包,是优化问题的一个常见例子,通常用于资源分配或决策问题。 4. 矩阵链乘法:通过最小化运算次数来优化矩阵乘法的过程。 **第32章:贪心算法** 贪心算法是另一种解决优化问题的...

    深圳大学-硕士算法导论期末真题.rar

    《算法导论——递推关系与0-1背包问题解析》 在计算机科学领域,算法是解决问题的关键,而算法导论则是深入理解算法基础的重要教材。本次我们将探讨一个硕士算法导论课程中的期末真题,涉及到的核心知识点是递推...

    算法导论中科大算法导论_实验二__背包问题

    部分背包问题是0-1背包问题的一个变体,其中允许将物品分割成任意大小的部分装入背包。每件物品的重量为`Wi`,价值为`Vi`,背包的容量为`C`。目标同样是使装入背包的物品总价值最大。 #### 贪心算法方法 部分背包...

    [麻省理工学院-算法导论].Lecture.Notes

    - 背包问题:0-1背包和完全背包问题的动态规划解法。 4. **lecture06.pdf - 回溯法** - 回溯法的基本原理:尝试所有可能的解,遇到错误时回退到上一步。 - 八皇后问题:回溯法的经典应用。 - 字符串匹配:KMP...

    算法导论课后答案

    - **15.3-1**至**15.3-5**:探讨了如何解决0/1背包问题,给出了具体的算法实现。 #### 15.4 最短路径 - **15.4-1**至**15.4-6**:介绍了如何利用动态规划求解单源最短路径问题。 以上是对《算法导论》中部分章节...

    Algorithms--据说比《算法导论》更好的算法书籍

    本书籍《Algorithms》被誉为“据说比《算法导论》更好的算法书籍”,它由S. Dasgupta、C. H. Papadimitriou 和 U. V. Vazirani 联合编著,并于2006年出版。该书全面覆盖了计算机科学中的核心算法概念,通过一系列...

    算法导论课件(全)

    - 应用场景包括0-1背包问题、旅行商问题等组合优化问题。 6. **并行计算**: - 分解任务为多个子任务,同时在多处理器或多计算机上执行,提高计算速度。 - OpenMP、MPI是常见的并行编程模型。 - 并行算法设计时...

    算法文档无代码浅谈几类背包问题

    分组背包问题的动态规划方程与0-1背包类似,只是在求解时需要对每组物品分别进行考虑。 ### 二维费用背包问题 二维费用背包问题是指每件物品除了有重量和价值之外,还有其他的费用。即背包问题需要在限制重量的情况...

    0_1背包问题

    算法导论:16.2-2,给出一个运行时间O(nW)的动态规划

    中科大 算法导论 课件(全套11)回溯法

    - **0-1背包问题**: 寻找最大价值的物品组合。 - **八皇后问题**: 将8个皇后放置在8×8的棋盘上,使得任意两个皇后不发生冲突。 - **图着色问题**: 为图中的每个顶点着色,使得相邻顶点颜色不同。 **10. 学习...

    算法课件从0-7章,非常不错

    - 应用实例:0-1背包问题、图着色问题等。 7. **第7章 概率算法** - 概率算法基础:概率论在算法设计中的应用,如随机化算法。 - 蒙特卡洛方法和拉斯维加斯方法:两种主要的概率算法类型及其特点。 - 实际应用...

    计算机算法导论与设计第五章

    计算机算法导论与设计第五章主要探讨了回溯法这一重要的算法策略,它在解决一些具有大量组合可能性的问题时尤其有效。回溯法的核心在于通过深度优先搜索来探索问题的解空间树,寻找满足特定条件的解。这种方法适用于...

    麻省理工算法导论

    在课程中,可能会讲解0-1背包问题、完全背包问题和多重背包问题,以及动态规划方法来解决这些问题。动态规划通过构建子问题并存储解决方案,避免了重复计算,提高了效率。此外,贪心策略也可能被用于背包问题的简化...

    算法导论部分实现代码Java版

    - **背包问题**:0-1背包、完全背包、多重背包,解决资源分配问题。 - **最长公共子序列(LCS)**:寻找两个序列的最长公共子序列,应用于文本相似性计算。 - **斐波那契数列**:通过记忆化或动态规划解决递归...

    算法导论第三版答案(完整版)

    7. **分支限界法**:用于优化问题,如旅行商问题、0-1背包问题等。 8. **概率算法和随机化算法**:如Monte Carlo方法、Las Vegas方法,以及在计算几何和图论中的应用。 9. **字符串匹配算法**:KMP算法、Boyer-...

    算法导论全套PPT(含答案)讲义(英文).rar

    - 背包问题:0/1背包、完全背包、多重背包问题。 - 最长公共子序列、最长递增子序列:字符串处理和序列分析中的经典问题。 - 编辑距离:衡量两个字符串的相似度。 9. **数据结构**: - 数组、链表、栈、队列:...

    基于算法导论的c++代码

    - **背包问题**:0-1背包、完全背包、多重背包,求解如何在容量限制下使物品价值最大化。 - **最长公共子序列(LCS)**:找出两个序列中长度最长的公共子序列,用于比较序列相似度。 5. **数据结构**: - **栈和...

Global site tag (gtag.js) - Google Analytics