递归回溯法求解0/1背包问题python完整代码加上注释
时间: 2023-09-17 07:14:32 浏览: 48
好的,这是Python实现0/1背包问题的递归回溯法完整代码,我已经加上了注释,希望能够帮到您:
```python
def knapsack(items, max_weight):
"""
递归回溯法求解0/1背包问题
:param items: 物品列表,每个物品是一个元组,元组包含两个值,第一个是物品的价值,第二个是物品的重量
:param max_weight: 背包的最大承重
:return: 背包中所能容纳的最大价值
"""
n = len(items) # 物品数量
def backtrack(i, weight):
"""
递归解决问题
:param i: 当前考虑的物品下标
:param weight: 当前背包已经装了的重量
:return: 当前状态下的最大价值
"""
if i == n or weight == max_weight: # 如果已经考虑完所有物品,或者背包已经装满了,则返回0
return 0
# 如果当前物品的重量已经超过了背包的剩余承载能力,直接跳过这个物品
if weight + items[i][1] > max_weight:
return backtrack(i + 1, weight)
# 不选当前物品,直接考虑下一个物品
res = backtrack(i + 1, weight)
# 选当前物品,考虑下一个物品,并把当前物品的价值加入到结果中
res = max(res, items[i][0] + backtrack(i + 1, weight + items[i][1]))
return res
return backtrack(0, 0) # 从第一个物品开始考虑,背包当前重量为0
```
使用方法:
```python
items = [(6, 2), (10, 2), (12, 4), (8, 3), (7, 1)]
max_weight = 8
print(knapsack(items, max_weight)) # 输出:26
```