322. 零钱兑换
题目描述:
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
你可以认为每种硬币的数量是无限的。
和 518.零钱兑换II 区别在于本题返回凑成总金额所需的最少的硬币个数,而 518.零钱兑换II 返回可以凑成总金额的硬币组合数
区别在于:
- 递推公式不同
本题:dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
518.零钱兑换II:dp[j] += dp[j - coins[i]]; // 求总和
- 初始化不同
本题 dp[0] = 0; 然后其他元素初始值设为正无穷 518.零钱兑换II 中 dp[0] = 1;
- 遍历顺序要求不同
本题:求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。
518.零钱兑换II求得是组合数,一定要外层for循环遍历物品,内层for遍历背包。
如果dp[j - coins[i]]是初始值则跳过,if (dp[j - coins[i]] == INT_MAX) continue;
dp五步曲:
- dp[i] 表示总金额为 i 所需的最少的硬币个数
- 递推公式:dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
- 初始化
dp[0]=0;
其他的初始化为正无穷
- 遍历顺序
此时,内外层顺序无关完全背包物品可以重复使用,所以内层正序(01背包中一维dp,内层必须倒序,保证只用一次)
- 打印dp
如果dp[j - coins[i]]是初始值则跳过, if (dp[j - coins[i]] == INT_MAX) continue;
279. 完全平方数(完全背包)
题目描述:
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n,返回和为 n 的完全平方数的最少数量。
完全平方数是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、 4、9 和 16 都是完全平方数,而 3 和 11 不是。
全站分卷索引 · 42 卷
- 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
- 2找出所有子集的异或总和再求和
- 3哈希表
- 4哈希冲突
- 5红黑树与AVL树
- 6平衡二叉树(AVL树)
- 7将有序数组转换为二叉搜索树
- 83. 分割(组合问题)
- 9方法论
- 10509. 斐波那契数
- 1162. 不同路径
- 1296. 不同的二叉搜索树
- 13322. 零钱兑换
- 14爬楼梯
- 15背包小总结 (01背包、完全背包)
- 16子序列问题
- 17674. 最长连续递增序列
- 18115. 不同的子序列
- 19总结
- 20技巧总结
- 21时间序列模型
- 22区间DP模型
- 23664. 奇怪的打印机
- 24编辑距离
- 25回文串
- 26DP递推公式总结
- 27排序算法
- 28其他算法
- 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
- 302. TOP N问题
- 313. 分布式的TOP N问题
- 322. Astar数据结构 + 公式
- 334. 代码实现
- 345. 总体代码
- 35堆排序
- 36单源最短路
- 37思维导图
- 38链表
- 39回溯
- 40贪心
- 41动态规划
- 42排序