分数背包 vs 0/1 背包问题

17 Mar 2025 | 5 分钟阅读

在了解分数背包问题和0/1背包问题的区别之前,我们应该分别了解分数背包问题和0/1背包问题。

什么是背包问题?

假设你有一个容量有限的背包或袋子,每个物品都有一定的重量和价值。这里的问题是“应该将哪些物品放入背包中,使得总重量不超过限制,且物品的总价值尽可能大?”

考虑一个现实生活中的例子。假设有一个小偷进入博物馆。小偷带着一个容量有限的背包或袋子。博物馆里有各种不同价值的物品。小偷需要决定应该把哪些物品放进袋子里,才能使利润最大化。

与背包问题相关的一些重要点是:

  • 它是一个组合优化问题。
  • 给定N个物品的集合——通常从1到N编号;每个物品都有质量wi和价值vi。
  • 它确定每个物品要包含在集合中的数量,以使总重量M小于或等于给定限制,并且总价值尽可能大。
  • 该问题通常出现在存在财务限制的资源分配中。

假设我们有一个15公斤的背包,所以 M = 15 公斤。这意味着背包的总重量是15公斤。放入背包的物品的总重量应该小于或等于 M。给出了一些物品,它们具有一些关键特征,即物品的重量和物品的价值。正如我们可以在下面观察到的,第一个物品的重量是12公斤,价值是$4;第二个物品的重量是2公斤,价值是$2;第三个物品的重量是1公斤,价值是$1;第四个物品的重量是4公斤,价值是$10;第五个物品的重量是1公斤,价值是$2。在这里,我们必须决定是否要包含该物品。

背包问题的变体

背包问题有两种变体

  • 0/1背包问题:在0/1背包问题中,物品是不可分割的。这里,“不可分割”意味着我们不能分割一个物品。在这种情况下,我们要么拿一个物品,要么不拿。我们要么完全拿走物品并放入背包,要么完全不拿。我们不可能将物品的一部分放入背包。

这里,“0”表示我们不拿该物品,“1”表示我们完全拿该物品。这种类型的问题通过使用动态规划方法解决。

与0/1背包问题相关的一些重要点是:

  • 在这个问题中,我们不能拿取物品的一部分。在这里,我们必须决定是否拿取物品,即x = 1,或者不拿取物品,即x = 0。
  • 贪心算法在这个问题中不能提供最优结果。
  • 另一种方法是按单位重量成本对物品进行排序,然后从最高成本的物品开始,直到背包装满。但这仍然不是一个好的解决方案。假设有N个物品。我们有两个选择,要么选择物品,要么不选择物品。蛮力方法的时间复杂度为O(2N)指数级。因此,我们不使用蛮力方法,而是使用动态规划方法来获得最优解。
  • 分数背包问题:在这个问题中,物品是可分割的。这里,“可分割”意味着你可以拿取物品的任意一部分。这个问题通过使用贪心算法解决。

与分数背包问题相关的一些重要点是:

  • 我们知道分数背包问题可以使用物品的一部分,所以在这个问题中使用贪心算法。
  • 分数背包问题可以通过首先根据物品的价值对其进行排序来解决,这可以在 O(NlogN) 时间内完成。这种方法首先找到最有价值的物品,我们尽可能多地考虑最有价值的物品,所以从价值最高的物品 vi 开始。然后,我们考虑排序列表中的下一个物品,并通过这种方式,我们在 O(N) 的时间复杂度内执行线性搜索。
  • 因此,总运行时间将是 O(NlogN) 加上 O(N),等于 O(NlogN)。我们可以说分数背包问题比0/1背包问题解决得快得多。

0/1背包问题和分数背包问题之间的区别。

Fractional vs 0/1 knapsack problem
0/1 背包问题分数背包问题
这个问题使用动态规划方法解决。这个问题使用贪心算法解决。
例如:假设我们有10个单位的空间。A的量是5,B的量是4,C的量是3。首先,我们放入A,然后我们放入B到背包中。背包占据的总空间是9。由于背包的总空间是10,所以我们不能将“C”放入背包。例如,假设我们有10个单位的空间。A的量是5,B的量是4,C的量是3。首先,我们放入A,然后我们放入B到背包中。到目前为止,背包占据的总空间是9。背包中还剩1个单位的空间。所以,我们可以从C中取出1个单位的量放入背包中。现在,背包中的空间已满。
这个问题要么拿走一个物品,要么不拿。它不拿走物品的一部分。在这个问题中,我们也可以拿走物品的一部分。
它具有最优结构。它具有最优结构。
它找到一个最有价值的子集物品,其总价值小于或等于重量。它找到总价值等于重量的物品。