def knapsack_backtracking(weights, values, W, n, i=0, current_weight=0, current_value=0, selected_items=None):
if selected_items is None:
selected_items = []
if i == n:
if current_weight <= W:
return current_value, selected_items[:]
else:
return float('-inf'), []
max_value_without_item, items_without_item = knapsack_backtracking(weights, values, W, n, i + 1, current_weight,
current_value, selected_items)
if current_weight + weights[i] <= W:
selected_item = (weights[i], values[i])
selected_items_with_item = selected_items + [selected_item]
max_value_with_item, items_with_item = knapsack_backtracking(weights, values, W, n, i + 1,
current_weight + weights[i],
current_value + values[i],
selected_items_with_item)
else:
max_value_with_item, items_with_item = float('-inf'), [] # 超出容量,当前选择无效
if max_value_with_item > max_value_without_item:
return max_value_with_item, items_with_item
else:
return max_value_without_item, items_without_item
weights = [2, 3, 4, 5]
values = [3, 4, 5, 6]
W = 5
n = len(weights)
max_value, selected_items = knapsack_backtracking(weights, values, W, n)
print(f"最大价值是: {max_value}")
print(f"选用的物品是: {selected_items}")