利用回溯法的递归框架,实现 01 背包问题,
时间: 2023-07-07 09:41:58 浏览: 59
好的,以下是 01 背包问题的回溯法递归实现代码:
```python
def knapsack(values, weights, capacity):
"""
:param values: List[int] 物品的价值数组
:param weights: List[int] 物品的重量数组
:param capacity: int 背包的容量
:return: int 最优解的价值
"""
n = len(values) # 物品数量
max_value = [0] # 最优解的价值
def backtrack(i, cur_weight, cur_value):
# i:当前物品下标,cur_weight:当前放入背包的重量,cur_value:当前放入背包的价值
if i == n: # 遍历完所有物品
max_value[0] = max(max_value[0], cur_value) # 更新最优解的价值
return
# 不选当前物品
backtrack(i + 1, cur_weight, cur_value)
# 选当前物品,若放入后不超重,则继续往下放
if cur_weight + weights[i] <= capacity:
backtrack(i + 1, cur_weight + weights[i], cur_value + values[i])
backtrack(0, 0, 0)
return max_value[0]
```
该算法的时间复杂度为 $O(2^n)$,因为每个物品都有选和不选两种情况,总共有 $2^n$ 种选择方案。在实际问题中,该算法只适用于物品数量较小的情况,对于大规模问题需要使用动态规划算法。