算法设计作业

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}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值