dp专题13 零钱兑换II
dp专题13 零钱兑换II
原创 已于 2024-01-17 11:20:04 修改 · 粉丝可见 · 464 阅读 · 7 · 7 · 本内容遵循CC 4.0 BY-SA版权协议 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/135625365
本题链接: . - 力扣(LeetCode)
题目:


思路:
根据题意,这是一道很裸的背包问题,其中这里是返回 背包方案数 的。
我们可以直接推出公式 :dp[ j ] += dp[ j - coins[ i ] ]
在我之前做的笔记中,写过具体的背包方案数dp公式,参考我之前的详解即可: dp专题10 目标和

最后我们再明确一下题目,题目要求是 硬币数量是无限的,说明这是一个 完全背包问题。
完全背包问题 和 01 背包问题区别在于 遍历背包的顺序。
01 背包的 背包 遍历顺序:逆向。
完全背包的 背包 遍历顺序: 正向。
具体原理是:
背包 逆向 遍历的时候, 物品只能 取 1 次.(01 背包)
代码详解:
1 | |
背包 正向 遍历的时候, 物品可以取多次.(完全 背包)
代码详解:
1 | |
所以 完全背包问题 和 01 背包问题区别在于 遍历背包的顺序。
同样的道理,我们结合dp递推的公式 + 背包遍历顺序,就可以解出这道完全背包问题方案数的问题了。
在这里再扩展一下问题,遍历顺序中,先遍历背包还是先遍历物品?
我们再看一下这两种遍历方法的效果:
①先遍历物品再遍历背包
1 | |
②先遍历背包再遍历物品
1 | |
所以 背包问题 遍历顺序中 :
先遍历物品再遍历背包: 组合 数。
先遍历背包再遍历物品: 排列 数。
综上所述。
代码详解如下:
1 | |
最后提交:

觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭
wechat pay
ali pay