题目链接

零钱兑换

题目描述

image.png

实现代码

动态规划思想:记dp[i]表示使用coins数组凑成i金额的最少兑换次数,因此有动态转移方程:

dp[i] = min(dp[i - coins[0], … dp[i-coins[n-1]) + 1

需要注意以下几点:

  1. 初始化条件:

    dp[0] = 0; dp[coins[i]] = 1

  2. 不能兑换的判定(即值为-1的判定)

实现代码:

  1. class Solution {
  2. public int coinChange(int[] coins, int amount) {
  3. int[] dp = new int[amount + 1];
  4. int len = coins.length;
  5. for (int i = 1; i <= amount; i++) {
  6. int min = Integer.MAX_VALUE;
  7. boolean can = false;
  8. for (int j = 0; j < len; j++) {
  9. if (i < coins[j]) {
  10. continue;
  11. }
  12. if (i == coins[j]) {
  13. min = 0;
  14. can = true;
  15. break;
  16. }
  17. if (dp[i - coins[j]] == -1) {
  18. continue;
  19. }
  20. if (min > dp[i - coins[j]]) {
  21. min = dp[i - coins[j]];
  22. can = true;
  23. }
  24. }
  25. dp[i] = can ? min + 1 : -1;
  26. }
  27. return dp[amount];
  28. }
  29. }