热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

对01背包问题的思考

经过我的一通研究,动态规划已经被我分成两大类,即分阶段决策问题以及枚举问题.在枚举界,深度优先搜索可谓明星算法,不仅如此,它还能跨界发展,因为在动态规划界,DFS天然的树状路径总

经过我的一通研究, 动态规划已经被我分成两大类,即分阶段决策问题以及枚举问题.在枚举界,深度优先搜索可谓明星算法,不仅如此,它还能跨界发展,因为在动态规划界,DFS天然的树状路径总让人觉得与DP的最优子结构有着暧昧不清的关系.如果我们能用DFS的思想去分析问题,然后最终打开一扇DP的大门就好了.
然而,事实证明上述想法里YY的成分多一些,可是DFS和DP确实存在着某种神秘关联,下面对01背包问题的分析就是铁证.

还没贴图,会补上的…

背包问题

先把问题描述清楚:

背包最大负重为5,现有三个物品,重量是(2,3,4).相应地,三个物品的价值为(10,15,20).现在要从三个物品中选择若干件装入背包.请问:在不超出背包负重上限的前提下,怎样选取才能使包中物品总价值最大?

第0个思路

经观察,应选择前两个物品.

好好好满分.现在背包容量是65536,有4096个物品可以选,麻烦再来观察一下?
别跟我提贪心,我要是再相信贪心我就是DOG.

第一个思路

不扯淡了,其实第一个想到,也是最直观的策略,一定是枚举:

方案 最终重量 最终价值
(0,0,0) 0 0
(0,0,1) 4 20
(1,1,1) 8 45

其中(0,0,0)表示”不选第一个,不选第二个,不选第三个”.

好好好,又是满分.现在背包容量是65536…

怎么枚举?

仔细分析上述枚举的过程:

  • 首先面对0号物品,我们可以选择也可以不选择;
  • 如果我们选择0号物品:
    • 现在我们面对1号物品,我们可以选择也可以不选择;
    • 如果我们选择1号物品:
      • 现在我们面对2号物品,我们可以选择也可以不选择:
      • 如果我们选择2号物品:
        • 由于已经选择了1号和2号,背包已经装满了,不能选择
      • 如果我们不选择2号物品:
        • 我们最终的选择是(1,1,0),总重量是5,总价值是25
    • 如果我们不选择1号物品:
  • 如果我们不选择0号物品

算了,直接上图吧:

更精确的表述

当处理2号物品的时候,我们需要的参数,如果背包的当前重量,已拥有的总价值等等,通通需要从树根开始计算.这肯定是不对的,正确的遍历方法是随身携带参数:

其中,节点(0,1,5)所表述的问题是

背包最大负重为5,可选物品为(0,1,2).假设我一定会选择0号物品.请问在满足题设的前提下,怎样选取剩余物品才能使背包中的价值最大?

整个问题的最终答案取决于森林中每个树的根.最终取决于森林中所有的叶.

动态规划

能用动态规划解决问题吗?回想一下,动态规划的大门前永远都站着个巨大的门神:重叠子问题,最优子结构.
最优子结构已经清楚地写到递归树的脸上去了.
然而重叠子问题在哪儿?上述递归树有相同的节点吗?

掘地三尺

找不到重叠子问题?那就往下挖.

回到递归树(森林)上.现在将注意力集中到最后一层.最后一层有两类节点,一类节点是(2,0,X),另一类是(2,1,X).各占一半.我们以(2,0,X)为例.(为了方便叙述,”第2层的节点”代表的是”森林中所有高度为2的节点”).

因为X是背包的上限,所以X非负数.又从上述分析知道,随着高度增加,X可能减少但绝不增加.再考虑到X的初始值为5.所以X最多有6个不同取值.

所以,最后一排最多有12不同的节点.

回头再看,上述分析过程中并没有用到”最后一层”这个条件,我们可以把分析应用到”第一层”或者”第二层”,这只会改变一些无关紧要的文字描述,分析过程完全不变,因此结论也完全不变.所以我们可以把结论中的”最后一层”去掉,这样结论表述为:

任意一层最多有12个不同节点.

乍一看是废话,因为森林只有3层,每层分别只有2,4,8个节点,肯定小于12.其实恰恰相反,这是个很重要的结论.

我们只要增加一个物品,比如(编号:3,重量:5,价值30),上述递归树的高度就会变成4.如果森林有第4层,它将有16个节点,由刚才的分析可以知道,这16个节点里面最多有12个不同的节点.又因为每个节点对应一个子问题,因此第4层里出现的16个子问题中,最多只有12个互不相同的子问题,即至少有4个子问题是重复的.

同理,如果森林有5层,那么第5层32个子问题里至少有20个子问题是重复的.
如果森林有6层…

重叠子问题:KAO,这都被找到了,真是R了G了.

复杂度

于是我们可以愉快地使用动态规划了.

等等,作为一个严谨的学者(别笑),我们先来分析一下复杂度吧.

现在一般化我们的问题,假设我们有N个物品,背包负重上限是M,那么背包问题复杂度的两个上限分析如下.

算法的第一个复杂度上限是O(2^N).

这个上限来自于深度优先搜索.并且这个上限并没有什么存在感,也就是说这个结论告诉我们无论算法多慢你都不比惊讶.

我们来分析算法的另一个上限.
首先每个物品在递归树上占一层.
其次,考虑到重叠子问题,以及上述一通乱七八糟的分析,我们知道每层最多有(M+1)个不同子问题.
于是我们可以轻易得出另一个上限:

O(N*M)是动态规划解决背包问题的第二个复杂度上限

这样一来,最终结论就是:

动态规划解决01背包问题的复杂度是O(2^N)和O(N*M)中较小的那个.其中N是物品个数,M是背包负重上限.

什么?你说背包上限是65536,物品有4096个?那也才不到3亿次计算而已.


推荐阅读
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • CSWS_E_ROB深度估计方法
    论文链接:https:arxiv.orgpdf1708.02287.pdf正文翻译概述……首先,我们把深度估计看做一种多类别的密集标记任务,然后与基于公式的 ... [详细]
  • 搜索引擎技术概论(上篇):核心原理与应用分析
    搜索引擎技术概论(上篇)探讨了搜索的基本概念及其核心原理。搜索的本质在于信息检索,即用户通过输入关键词,利用特定的算法从海量数据中快速定位并提供所需信息。本文详细分析了搜索引擎的工作机制及其在实际应用中的表现。 ... [详细]
  • 如何优化淘金币推广以提升效果?中小卖家在淘金币频道的制胜之道 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在《数字图像处理及应用(MATLAB)第4章》中,详细探讨了“逢七必过”游戏规则的实现方法,并结合数字图像处理技术进行了深入分析。本章通过丰富的实例和代码示例,展示了如何利用MATLAB实现这一游戏规则,并介绍了数字图像处理的基本原理和技术应用。内容涵盖了图像增强、滤波、边缘检测等多个方面,为读者提供了全面的技术支持和实践指导。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • 浅析卷积码的应用及其优势:探讨卷积编码在通信系统中的关键作用与特性
    本文详细介绍了卷积编码的基本原理,并深入分析了其在通信系统中的应用及其显著优势。卷积编码通过在编码过程中引入冗余信息,有效提高了数据传输的可靠性和抗干扰能力,成为现代通信系统中不可或缺的关键技术。文章还探讨了卷积编码在不同场景下的具体实现方法及其性能特点。 ... [详细]
  • 在2019年寒假强化训练中,我们深入探讨了二分算法的理论与实践应用。问题A聚焦于使用递归方法实现二分查找。具体而言,给定一个已按升序排列且无重复元素的数组,用户需从键盘输入一个数值X,通过二分查找法判断该数值是否存在于数组中。输入的第一行为一个正整数,表示数组的长度。这一训练不仅强化了对递归算法的理解,还提升了实际编程能力。 ... [详细]
  • Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战?
    Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战? ... [详细]
  • 业务团队与独立团队在数据分析领域的效能对比:谁更胜一筹?
    业务团队与独立团队在数据分析领域的效能对比:谁更胜一筹? ... [详细]
  • 双因子安全机制与WiFi万能钥匙的较量:解析其背后的对抗策略
    几乎所有智能手机用户都熟悉类似“WiFi万能钥匙”的应用程序。这款应用凭借庞大的下载量,不仅在各大应用商店中占据显著位置,还长期稳居下载排行榜前列。然而,随着双因子认证等高级安全机制的普及,这类应用面临着前所未有的挑战。本文将深入探讨双因子安全机制与WiFi万能钥匙之间的对抗策略,分析其背后的技术原理和安全风险。 ... [详细]
author-avatar
mobiledu2502914617
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有