Data Structures Algorithms 简明教程

Fractional Knapsack Problem

背包问题表述如下:给定一项集合,其包含重量和利润值,必须确定要添加到背包中的项目子集,以便项目的总重量不得超过背包的限制,其总利润值最大。

它是使用贪婪算法解决的最流行问题之一。它被称为 Fractional Knapsack Problem

为了更简单地解释这个问题,考虑一个有 12 个问题且每个问题 10 分的考试,其中只能尝试 10 个问题才能获得 100 分的高分。现在,考试的参加者必须计算最有利的问题 - 即他们有信心的问题 - 以获得最高分。但是,他不能尝试全部 12 个问题,因为对于尝试回答这些问题不会获得任何额外分数。这是背包问题的最基本的实际应用。

Knapsack Algorithm

作为输入,分数背包算法将要添加到背包中的物品的重量 (Wi) 和利润值 (Pi) 作为输入,而输出是添加到背包中的物品的子集,该子集不会超过限制并且具有最大利润。

Algorithm

  1. 考虑所有物品及其各自提到的重量和利润。

  2. 计算所有物品的 Pi/Wi,并根据其 Pi/Wi 值对其进行降序排列。

  3. 在不超过限制的情况下,将物品添加到背包中。

  4. 如果背包仍然可以存放一些重量,但其他物品的重量超过了限制,则可以添加下一个时间的几分之一部分。

  5. 因此,给它起了分数背包问题这个名字。

Examples

  1. 对于给定的物品组和 10 公斤的背包容量,找到要添加到背包中的物品子集,使其利润最大。

Solution

Step 1

给定,n = 5

Wi = {3, 3, 2, 5, 1}
Pi = {10, 15, 10, 12, 8}

计算所有项目的 Pi/Wi

Step 2

根据 Pi/Wi 对所有项目进行降序排列

Step 3

在不超过背包容量的情况下,将物品放入背包中以获得最大利润。

Knapsack = {5, 2, 3}

但是,背包仍然可以容纳 4 公斤的重量,但是下一个重量为 5 公斤的物品将超过容量。因此,将在背包中仅添加 5 公斤的 4 公斤重量。

因此,背包的重量 = [(1 * 1) + (1 * 3) + (1 * 2) + (4/5 * 5)] = 10,最大利润 = [(1 * 8) + (1 * 15) + ( 1 * 10) + (4/5 * 20)] = 37。

Example

以下是使用贪心算法的分数背包算法的最终实现 −

Applications

背包问题在现实世界的许多应用中只有几个 −

  1. 在不损失太多材料的情况下切割原材料

  2. 挑选投资和投资组合

  3. 资产支持证券化资产选择

  4. 为 Merkle-Hellman 算法生成密钥

  5. Cognitive Radio Networks

  6. Power Allocation

  7. 移动节点网络选择

  8. Cooperative wireless communication