← 返回目录

322. 零钱兑换

第 13 / 42 卷日期:

题目描述:

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

你可以认为每种硬币的数量是无限的。

和 518.零钱兑换II 区别在于本题返回凑成总金额所需的最少的硬币个数,而 518.零钱兑换II 返回可以凑成总金额的硬币组合数

区别在于:

  1. 递推公式不同

本题:dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);

518.零钱兑换II:dp[j] += dp[j - coins[i]]; // 求总和

  1. 初始化不同

本题 dp[0] = 0; 然后其他元素初始值设为正无穷 518.零钱兑换II 中 dp[0] = 1;

  1. 遍历顺序要求不同

本题:求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。

518.零钱兑换II求得是组合数,一定要外层for循环遍历物品,内层for遍历背包。

如果dp[j - coins[i]]是初始值则跳过,if (dp[j - coins[i]] == INT_MAX) continue;

dp五步曲:

  1. dp[i] 表示总金额为 i 所需的最少的硬币个数
  2. 递推公式:dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
  3. 初始化

dp[0]=0;

其他的初始化为正无穷

  1. 遍历顺序

此时,内外层顺序无关完全背包物品可以重复使用,所以内层正序(01背包中一维dp,内层必须倒序,保证只用一次)

  1. 打印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. 1代码随想录知识星球精华(最强八股文)第五版(算法篇)
  2. 2找出所有子集的异或总和再求和
  3. 3哈希表
  4. 4哈希冲突
  5. 5红黑树与AVL树
  6. 6平衡二叉树(AVL树)
  7. 7将有序数组转换为二叉搜索树
  8. 83. 分割(组合问题)
  9. 9方法论
  10. 10509. 斐波那契数
  11. 1162. 不同路径
  12. 1296. 不同的二叉搜索树
  13. 13322. 零钱兑换
  14. 14爬楼梯
  15. 15背包小总结 (01背包、完全背包)
  16. 16子序列问题
  17. 17674. 最长连续递增序列
  18. 18115. 不同的子序列
  19. 19总结
  20. 20技巧总结
  21. 21时间序列模型
  22. 22区间DP模型
  23. 23664. 奇怪的打印机
  24. 24编辑距离
  25. 25回文串
  26. 26DP递推公式总结
  27. 27排序算法
  28. 28其他算法
  29. 294. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历
  30. 302. TOP N问题
  31. 313. 分布式的TOP N问题
  32. 322. Astar数据结构 + 公式
  33. 334. 代码实现
  34. 345. 总体代码
  35. 35堆排序
  36. 36单源最短路
  37. 37思维导图
  38. 38链表
  39. 39回溯
  40. 40贪心
  41. 41动态规划
  42. 42排序