当前位置:实例文章 » 其他实例» [文章]DAY45:动态规划(五)背包问题:01背包理论基础+二维DP解决01背包问题

DAY45:动态规划(五)背包问题:01背包理论基础+二维DP解决01背包问题

发布人:shili8 发布时间:2024-11-08 17:24 阅读次数:0

**DAY45:动态规划(五)背包问题**

在前面的几篇文章中,我们已经学习了动态规划的基本概念、算法设计思想以及如何应用到实际的问题上。今天我们要讨论的是一个经典的问题——01背包问题。

**01背包问题**

01背包问题是这样定义的:假设有 n 个物品,每个物品都有一个重量和价值,且每个物品只能选择一次。如果总重量不超过 W,则求出能获得的最大价值。

例如,如果我们有以下物品:

| 物品 | 重量 |价值 |
| --- | --- | --- |
| A |2 |6 |
| B |3 |10 |
| C |1 |4 |

如果总重量不超过5,则求出能获得的最大价值。

**01背包问题的解决方案**

我们可以使用动态规划来解决这个问题。首先,我们需要定义一个二维数组 dp,用于存储每个物品的最大价值。

def knapsack(W, wt, val, n):
 # Create a table to store results of subproblems K = [[0 for w in range(W +1)] for i in range(n +1)]

 # Build the table. W is capacity, wt[i] is weight of the ith item,
 # val[i] is value of the ith item, and n is number of items.
 for i in range(n +1):
 for w in range(W +1):
 if i ==0 or w ==0:
 K[i][w] =0 elif wt[i -1] <= w:
 K[i][w] = max(val[i -1] + K[i -1][w - wt[i -1]], K[i -1][w])
 else:
 K[i][w] = K[i -1][w]

 return K[n][W]


在这个解决方案中,我们首先创建一个二维数组 dp,大小为 (n +1) x (W +1),用于存储每个物品的最大价值。

然后,我们使用两个循环来填充这个数组。第一个循环是对物品的循环,第二个循环是对重量的循环。

在每次循环中,我们检查当前物品是否可以放入背包。如果可以,则我们计算当前物品的最大价值,并将其与不选择当前物品时的最大价值进行比较。然后,我们选择哪一个更大作为当前物品的最大价值。

如果当前物品不能放入背包,则我们直接使用不选择当前物品时的最大价值。

最后,我们返回二维数组 dp 中的最后一个元素,这就是能获得的最大价值。

**示例代码**

# Example usage:
W =5wt = [2,3,1]
val = [6,10,4]
n = len(val)

max_value = knapsack(W, wt, val, n)
print("Maximum value:", max_value)


在这个示例代码中,我们定义了一个背包的容量 W,三个物品的重量和价值,以及物品的数量 n。然后,我们调用函数 knapsack 来计算能获得的最大价值,并打印出结果。

**总结**

01背包问题是动态规划的一个经典问题。通过使用二维DP来解决这个问题,我们可以有效地求出能获得的最大价值。在本文中,我们提供了一个解决方案,包括示例代码和注释,以帮助读者理解背包问题及其解决方案。

相关标签:算法动态规划
其他信息

其他资源

Top