dp-01背包
01背包问题是动态规划中的一个经典问题,通常用于解决资源分配问题。问题描述如下:
假设有一个背包,其最大承重为
问题特点
- 01性质:每个物品要么选择放入背包(1),要么不放入背包(0),不能选择部分放入或多次放入。
动态规划解法
动态规划(Dynamic Programming, DP)是解决01背包问题的常用方法。我们可以通过构建一个二维数组
状态转移方程
- 如果不选择第
dp[i][j] = dp[i-1][j] )。 - 如果选择第
dp[i][j] = dp[i-1][j-w_i] + v_i ),前提是 $ j geq w_i )。
因此,状态转移方程可以写成:
[ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w_i] + v_i) ]
初始化
表示没有物品时,无论背包容量是多少,最大价值都是0。 表示背包容量为0时,无论有多少物品,最大价值都是0。
填表过程
从
空间优化
由于每次计算
[dp[j]=max(dp[j],dp[j-w_i]+v_i)]
需要注意的是,在更新
代码实现
以下是01背包问题的Python代码实现:
def knapsack(W, weights, values):
n = len(weights)
dp = [0] * (W + 1)
for i in range(n):
for j in range(W, weights[i] - 1, -1):
dp[j] = max(dp[j], dp[j - weights[i]] + values[i])
return dp[W]
总结
01背包问题通过动态规划的方法,可以在多项式时间内解决。通过构建状态转移方程和优化空间复杂度,可以高效地求解背包问题。
这是mcr130102的博客,转载请注明出处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律