image.png
image.png

动态规划

  1. public int coinChange(int[] coins, int amount) {
  2. int max = amount + 1; //这里最大值为amount
  3. int[] dp = new int[amount + 1];//dp[i]=j表示组成金额为i所需最少硬币为j
  4. Arrays.fill(dp, max);
  5. dp[0] = 0;
  6. for (int i = 1; i <= amount; i++) { //遍历求dp
  7. for (int j = 0; j < coins.length; j++) { //遍历每一种硬币金额
  8. if (coins[j] <= i) { //如果该硬币金额小于等于需要组成的金额
  9. //dp[i - coins[j]] + 1 表示使用该硬币组成
  10. dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
  11. }
  12. }
  13. }
  14. //判断是否发生了更新
  15. return dp[amount] > amount ? -1 : dp[amount];
  16. }