【算法】动态规划-背包问题

本文深入探讨了动态规划在解决背包问题中的应用,包括01背包和完全背包问题。通过实例解析了动态规划的状态转移方程,并提供了代码实现。同时,介绍了两个具体的力扣题目,分别是目标和问题与零钱兑换问题,同样使用动态规划求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  动态规划就是将问题划分为子问题,通过子问题的最优解得到原问题的最优解。动态规划把每个求解过程的子问题记录下来,下次碰到同样的子问题可以直接使用之前的结果。下面学习一类经典的背包问题。

1.01背包问题

问题是这样的:n 件物品,每个重量 w[i],价值 c[i] 。背包容量 V。问如何使得背包内物品总价值最大。每种物品只有一件。

定义 dp[i][j] 表示前 i 件物品装入容量 j 的背包的价值,那么:

dp[i][j] = Math.max(
	dp[i-1][j],		// 不放第 i 件物品
    dp[i-1][j-w[i]] + c[i]	// 放第 i 件物品
) 

因此代码如下:

for (int i = 0; i < n; i++) {
   
    for (int j = w[i]; j <= V; j++) {
   
        dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-w[i]] + c[i]);
    }
}

空间优化:

for (int i = 0; i < n; i++) {
   
    for (int j = V; j >= w[i]; j--) {
   
        dp[j] = Math
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值