01背包问题

01背包问题

​ 这是一个经典的动态规划问题,通常用于优化问题中。问题描述如下:有一个固定容量的背包,以及一组物品,每个物品有一个重量和一个价值,目标是选择一些物品放入背包中,使得背包中物品的总价值最大,且不能超过背包的容量。

以下是01背包问题的算法,使用动态规划解决:

  1. 初始化: 创建一个二维数组 dp,其中 dp[i][j] 表示在前 i 个物品中,背包容量为 j 时的最大总价值。初始化整个数组为0。
  2. 状态转移: 对于每个物品 i 和每个背包容量 j,计算以下值:
    • 如果物品 i 的重量大于背包容量 j,则 dp[i][j] = dp[i-1][j],即无法将物品 i 放入背包中。
    • 否则,考虑将物品 i 放入背包中,更新状态:dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]),其中 w[i] 是物品 i 的重量,v[i] 是物品 i 的价值。
  3. 最终结果: dp[n][W],其中 n 是物品的个数,W 是背包的容量。

下面是一个简单的Python实现:

pythonCopy codedef knapsack_01(weights, values, W):
    n = len(weights)
    dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]

    for i in range(1, n + 1):
        for j in range(W + 1):
            if weights[i - 1] > j:
                dp[i][j] = dp[i - 1][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1])

    return dp[n][W]

# 示例
weights = [2, 1, 3]
values = [4, 2, 3]
capacity = 4
result = knapsack_01(weights, values, capacity)
print("最大总价值:", result)

在这个例子中,背包容量为4,有3个物品,它们的重量分别是2、1、3,价值分别是4、2、3。算法计算得到的最大总价值是7。

比如:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值