贪心算法解决0-1背包问题——python版
贪心算法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好或最优的解。贪婪法的每次决策都以当前情况为基础并根据某个最优原则进行选择,不从整体上考虑其他各种可能的情况。
背包问题
本次例子为0-1背包问题:有 N 件物品和一个承重为 W 的背包(也可定义为体积),每件物品的重量是 wi,价值是 pi,求解将哪几件物品装入背包可使这些物品在重量总和不超过 C 的情况下价值总和最大。这个问题隐含了一个条件,每个物品只有一件,也就是限定每件物品只能选择 0 个或 1 个,因此又被称为 0-1 背包问题。
来看一个具体的例子,有一个背包,最多能承载重量为 W=150 的物品,现在有 7 个物品(物品不能分割成任意大小),编号为 1~7,重量分别是 wi=[35、30、60、50、40、10、25],价值分别是 pi=[10、40、30、50、35、40、30],现在从这 7 个物品中选择一个或多个装入背包,要求在物品总重量不超过 W 的前提下,所装入的物品总价值最高。
针对这个问题,有三种贪婪策略的选择问题。
第一:根据最小重量贪心策略,这个策略每次选择最小重量的物品,最终选择装入背包的物品重量依次是 10, 25, 30, 35, 40,此时包中物品总重量是 140,总价值是 155;
第二:根据最大价值贪心策略