01背包问题(回溯法-Python)

题目:

假设有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)

  • 30
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值