322.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * @Description:
  3. * @Version: 1.0
  4. * @Autor: zhuyijun
  5. * @Date: 2021-11-10 22:49:50
  6. * @LastEditTime: 2021-11-11 00:01:43
  7. */
  8. /*
  9. 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
  10. 计算并返回可以凑成总金额所需的 最少的硬币个数
  11. 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
  12. 你可以认为每种硬币的数量是无限的。
  13. 示例 1:
  14. 输入:coins = [1, 2, 5], amount = 11
  15. 输出:3
  16. 解释:11 = 5 + 5 + 1
  17. */
  18. #include <bits/stdc++.h>
  19. using namespace std;
  20. int helper(vector<int>& coins, int amount, vector<int>& list) {
  21. if (amount == 0) return 0;
  22. if (amount < 0) return -1;
  23. if (list[amount] != -1) return list[amount];
  24. int res = INT_MAX;
  25. for (int i = 0; i < coins.size(); i++) {
  26. int temp = helper(coins, amount - coins[i], list);
  27. if (temp == -1) continue;
  28. res = min(res, temp + 1);
  29. }
  30. if (res == INT_MAX) {
  31. res = -1;
  32. }
  33. list[amount] = res;
  34. return list[amount];
  35. }
  36. // 暴力递归解法 超时
  37. int coinChange1(vector<int>& coins, int amount) {
  38. vector<int> list(amount + 1, -1);
  39. return helper(coins, amount, list);
  40. }
  41. // dp 数组迭代解法
  42. int coinChange(vector<int>& coins, int amount) {
  43. vector<int> list(amount + 1, amount + 1);
  44. list[0] = 0;
  45. for (int i = 0; i < list.size(); i++) {
  46. for (int coin : coins) {
  47. if (i - coin < 0) {
  48. continue;
  49. }
  50. list[i] = min(list[i], 1 + list[i - coin]);
  51. }
  52. }
  53. return (list[amount] == amount + 1) ? -1 : list[amount];
  54. }
  55. int main() {
  56. vector<int> list{186, 419, 83, 408};
  57. cout << coinChange(list, 6249);
  58. }