给定不同面额的硬币 coins
和一个总金额 amount
。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins =[1, 2, 5]
, amount =11
输出:3
解释:11 = 5 + 5 + 1
示例 2:
输入:coins =[2]
, amount =3
输出:-1
示例 3:
输入:coins = [1], amount = 0 输出:0
示例 4:
输入:coins = [1], amount = 1 输出:1
示例 5:
输入:coins = [1], amount = 2 输出:2
dfs:
class Solution {public int coinChange(int[] coins, int amount) {int dfs = dfs(coins, amount);return dfs==1e9?-1:dfs;}public int dfs(int[] coins, int amount) {if (amount==0){return 0;}int res= (int) 1e9;for (int i = 0; i < coins.length; i++) {if (amount-coins[i]>=0){res=Math.min(res,dfs(coins,amount-coins[i])+1);}}return res;}
}
记忆化搜索:
class Solution {public int coinChange(int[] coins, int amount) {int[] dp=new int[10005];int dfs = dfs(coins, amount,dp);return dfs==1e9?-1:dfs;}public int dfs(int[] coins, int amount,int[] dp) {if (dp[amount]!=0){return dp[amount];}if (amount==0){return 0;}dp[amount]= (int) 1e9;for (int i = 0; i < coins.length; i++) {if (amount-coins[i]>=0){dp[amount]=Math.min(dp[amount], dfs(coins,amount-coins[i],dp)+1);}}return dp[amount];}
}
动态规划:
class Solution {public int coinChange(int[] coins, int amount) {int[] dp=new int[10005];for (int i = 1; i <=amount; i++) {dp[i]= (int) 1e9;for (int j = 0; j < coins.length; j++) {if (i-coins[j]>=0){dp[i]=Math.min(dp[i], dp[i-coins[j]]+1);}}}return dp[amount]==1e9?-1:dp[amount];}
}