动态规划01背包问题

动态规划是解决01背包问题的一种常用方法。01背包问题是一个经典的组合优化问题,通常描述如下:

给定一组物品,每个物品有一个重量(weight)和一个价值(value),以及一个固定容量的背包。目标是选择一些物品放入背包中,使得放入的物品的总重量不超过背包容量,同时总价值最大化。

以下是解决01背包问题的动态规划算法的基本步骤:

创建一个二维数组 dp,其中 dp[i][j] 表示在考虑前 i 个物品,且背包容量为 j 的情况下的最大价值。

初始化边界条件:

当没有物品可选时,即 i=0,dp[0][j] 应该都为0,因为没有物品可放入背包。

当背包容量为0时,即 j=0,dp[i][0] 也应该都为0,因为不论有多少物品,背包容量为0时无法放入任何物品。

使用动态规划递推公式填充 dp 数组。递推公式如下:

如果当前考虑的物品重量大于背包的容量,即 weight[i-1] > j,则 dp[i][j] = dp[i-1][j],表示不能放入当前物品,最大价值与前 i-1 个物品相同。

如果当前考虑的物品重量不大于背包的容量,即 weight[i-1] <= j,则需要考虑放入或不放入当前物品两种情况。取两者中的较大值:

如果不放入当前物品,即 dp[i][j] = dp[i-1][j]。

如果放入当前物品,即 dp[i][j] = dp[i-1][j - weight[i-1]] + value[i-1],其中 value[i-1] 表示当前物品的价值。

最终 dp[n][W] 即为解决问题的答案,其中 n 表示物品的数量,W 表示背包的容量。

下面是一个简单的Python示例代码来解决01背包问题:

def knapsack_01(weights, values, capacity):

n = len(weights)

dp = [[0] * (capacity + 1) for _ in range(n + 1)]

for i in range(1, n + 1):

for j in range(1, capacity + 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][capacity]

示例用法

weights = [2, 2, 3, 4, 5]

values = [3, 4, 5, 6, 7]

capacity = 7

print(knapsack_01(weights, values, capacity)) # 输出最大价值

这段代码将计算出给定物品和背包容量的情况下,可以获得的最大价值。

相关推荐
故事和你9112 小时前
洛谷-数据结构2-1-二叉堆与树状数组1
开发语言·数据结构·c++·算法·动态规划·图论
图码14 小时前
最大子数组和问题:从暴力到Kadane算法的优雅蜕变
数据结构·算法·动态规划·柔性数组
张赫轩(不重名)16 小时前
加权重心(换根DP)
c++·算法·动态规划·图论
2401_8401052016 小时前
题解: [GESP202409 八级] 美丽路径
数据结构·c++·算法·动态规划
qq_2965532717 小时前
【LeetCode】最大子数组乘积:三种解法从暴力到最优
数据结构·算法·leetcode·职场和发展·动态规划·柔性数组
故事和你9117 小时前
洛谷-数据结构2-1-二叉堆与树状数组2
开发语言·javascript·数据结构·算法·ecmascript·动态规划·图论
khalil10202 天前
代码随想录算法训练营Day-43 动态规划10 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
数据结构·c++·算法·leetcode·动态规划·子序列问题
sbjdhjd2 天前
2026年第十七届蓝桥杯大赛软件赛省赛 Python 大学 B 组 A-F 题 完整题解(小白友好版)
python·算法·职场和发展·蓝桥杯·pycharm·开源·动态规划
承渊政道2 天前
【动态规划算法】(似包非包以及卡特兰数问题深入解析)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
承渊政道2 天前
【动态规划算法】(一文讲透二维费用的背包问题)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法