LeetCode322.零钱兑换

小灰灰 2024-04-18 08:24 191阅读 0赞
  1. //322.零钱兑换
  2. #if 0
  3. /*
  4. 给定不同面额的硬币 coins 和一个总金额 amount。
  5. 编写一个函数来计算可以凑成总金额所需的最少的硬币个数。
  6. 如果没有任何一种硬币组合能组成总金额,返回 -1。
  7. 示例 1:
  8. 输入: coins = [1, 2, 5], amount = 11
  9. 输出: 3
  10. 解释: 11 = 5 + 5 + 1
  11. 示例 2:
  12. 输入: coins = [2], amount = 3
  13. 输出: -1
  14. class Solution {
  15. public:
  16. int coinChange(vector<int>& coins, int amount) {
  17. }
  18. };
  19. 解题思路 :
  20. dp[i] , i 就代表所需要凑齐的钱数 .因为题目给出不能凑出的为 -1. 所以初始化dp的时候就为 -1.
  21. 然后dp[0]表示 , 凑 0 所需要的硬币数 , 为 0;
  22. 然后 , 凑dp[i] 的时候 , 就可以把问题分解为 , 从硬币堆中拿出一枚coins[j] ,
  23. 然后所需要凑得就是 dp[i - coins[j]] , 就是说除去
  24. 拿走的这一枚钱数 , 剩下的要凑的钱数(在钱数逐渐增长的过程中 , 凑dp[i-coins[j]] 肯定会再前面计算出来) ,
  25. 然后就是比较 拿出的这枚硬币(coins[j]) 和 剩下要凑的钱数 dp[i - coins[j]] 一共所用的硬币数 ,
  26. 哪个是最小的(因为硬币面额不同 ,所求得达到总共面额的硬币数量也会不同).
  27. 每拿出一种硬币 , 它所需要的硬币数为 dp[i-coins[j]] +1 . 后面这个 1 表示的就是你所拿出的这枚硬币
  28. */
  29. #include<climits>
  30. class Solution
  31. {
  32. public:
  33. int coinChange(vector<int>& coins, int amount)
  34. {
  35. vector<int> dp;
  36. dp.resize(amount + 1, -1);
  37. dp[0] = 0;
  38. int size = coins.size();
  39. for (int i = 1; i < amount+1; ++i)
  40. {
  41. int _min = INT_MAX;
  42. for (int j = 0; j < size; ++j)
  43. {
  44. if ((i - coins[j] >= 0) && (dp[i - coins[j]] != -1))
  45. {
  46. _min = min(_min, dp[i - coins[j]] + 1);
  47. dp[i] = _min;
  48. }
  49. }
  50. }
  51. return dp[amount];
  52. }
  53. };
  54. int main()
  55. {
  56. vector<int> arr;
  57. /*arr.push_back(1);
  58. arr.push_back(3);
  59. arr.push_back(5);*/
  60. arr.push_back(2);
  61. Solution a;
  62. cout << a.coinChange(arr, 3) << endl;
  63. return 0;
  64. }
  65. #endif

发表评论

表情:
评论列表 (有 0 条评论,191人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 322 零钱兑换

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

    相关 leetcode322 零钱兑换

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

    相关 322. 零钱兑换

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

    相关 Leetcode 322. 零钱兑换

    题目重述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何

    相关 LeetCode-322. 零钱兑换

    [322. 零钱兑换][322.] 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币