题目:
假设有n中物品和一个购物车,物品i的价值为vi,重量wi,购物车的容量为W。每种物品只有一件,要么放入,要么不放入,不可拆分。在不超过购物车容量的情况下,选择将哪些物品放入购物车,能使放入的物品价值最高?
# 01背包问题(回溯法-Python)
def knapsack_backtracking(values, weights, capacity):
# 物品数量
n = len(values)
# 最大价值
max_value = 0
# 最优选择
best_solution = [0] * n
def backtrack(curr_weight, curr_value, index, solution):
# 声明外部变量
nonlocal max_value, best_solution
if index == n:
if curr_value > max_value:
# 更新最大价值和最优选择
max_value = curr_value
best_solution = solution.copy()
return
# 不选择当前物品
backtrack(curr_weight, curr_value, index + 1, solution)
# 选择当前物品
if curr_weight + weights[index] <= capacity:
solution[index] = 1
backtrack(
curr_weight + weights[index], curr_value + values[index], index + 1, solution)
solution[index] = 0
backtrack(0, 0, 0, [0] * n)
return max_value, best_solution
# 物品价值
values = [6, 3, 5, 4]
# 物品重量
weights = [2, 5, 4, 2]
# 背包可装载重量
capacity = 10
max_value, best_solution = knapsack_backtracking(values, weights, capacity)
print("最大价值为", max_value)
# 数字为1代表该物品被选择
print("最优选择为", best_solution)