递归回溯法求解0/1背包问题python语言完整代码加上注释
时间: 2023-09-17 11:12:00 浏览: 106
好的,以下是一份Python语言实现的递归回溯法求解0/1背包问题的完整代码,已经加上了注释说明:
```python
# 递归回溯法求解0/1背包问题
# 功能:给定物品重量列表和价值列表,背包容量,求能装入背包的最大价值
def knapsack(w, v, c):
"""
:param w: 一个列表,表示物品的重量
:param v: 一个列表,表示物品的价值
:param c: 背包的容量
:return: 能装入背包的最大价值
"""
n = len(w) # 物品个数
memo = [[-1] * (c + 1) for _ in range(n)] # 备忘录,用于记录之前计算过的状态
def dp(i, j):
"""
:param i: 当前考虑到第i个物品
:param j: 当前背包容量为j
:return: 能装入背包的最大价值
"""
if i == n: # 物品已经考虑完了
return 0
if memo[i][j] != -1: # 如果之前计算过,直接返回备忘录中的值
return memo[i][j]
res = dp(i + 1, j) # 不装第i个物品
if j >= w[i]: # 如果当前背包容量能装下第i个物品
res = max(res, v[i] + dp(i + 1, j - w[i])) # 装第i个物品
memo[i][j] = res # 记录备忘录
return res
return dp(0, c) # 从第0个物品开始考虑,背包容量为c
# 示例
w = [1, 2, 3] # 物品重量列表
v = [6, 10, 12] # 物品价值列表
c = 5 # 背包容量
print(knapsack(w, v, c)) # 输出结果:22
```
注释已经比较详细了,主要思路就是用递归回溯法,定义一个dp函数来求解能装入背包的最大价值,同时使用备忘录memo记录之前计算过的状态,避免重复计算。
阅读全文