DP | 28 背包问题总结

本文探讨了动态规划中的核心概念,包括确定DP数组及其下标含义、递推公式、初始化及遍历顺序。举例说明了不同类型的背包问题(如01背包、完全背包)的解决策略,并强调了在二维和一维DP数组中遍历顺序的重要性。

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

本文记录的是刷题过程中的重要概念和笔记。如有侵权,请联系删除。

图示区分

在这里插入图片描述
难是难在遍历顺序

DP五部曲

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

递推公式

问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:

动态规划:494.目标和(opens new window)
动态规划:518. 零钱兑换 II(opens new window)
动态规划:377.组合总和Ⅳ(opens new window)
动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)

问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); ,对应题目如下:

动态规划:474.一和零(opens new window)

问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); ,对应题目如下:

动态规划:322.零钱兑换(opens new window)
动态规划:279.完全平方数(opens new window)

遍历顺序

二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历
一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。

纯完全背包的一维dp数组实现,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
相关题目如下:

求组合数:
动态规划:518.零钱兑换II(opens new window)

求排列数:
动态规划:377. 组合总和 Ⅳ (opensnew window)、
动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)

如果求最小数,那么两层for循环的先后顺序就无所谓了,相关题目如下:

求最小数:
动态规划:322. 零钱兑换 (opens new window)、
动态规划:279.完全平方数

汇总思维导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值