本题来源与leetcode,大致意思是由一些不同面值的硬币,和一个整数,问使用这些硬币加和来组成这个整数需要的最少硬币数,如果不能用这些硬币组成这个整数,就返回-1。比如有硬币1,2,5。用数组表示就是coins
=
[1,
2, 5]
, 整数钱amount
= 11。11=5+5+1,就是最少需要3枚硬币。假如coins
= [2]
, amount = 3,就返回-1。本题使用动态规划解答。
public int coinChange(int[] coins, int amount) {
if(coins.length <= 0 || amount == 0)
return 0;
if(amount < 0){
return -1;
}
int dp[] = new int[amount+1];
for(int i = 1;i < amount+1; i++){
dp[i] = Integer.MAX_VALUE;
}
//dp[i]表示amount为i时需要的最少硬币数量
for(int j = 0;j<coins.length;j++)
for(int i = 1;i <= amount; i++){
if(i >= coins[j] && dp[i-coins[j]] != Integer.MAX_VALUE){
//取使用当前硬币和不使用当前硬币的最小值,使用的话其最少硬币数量加1
dp[i]=Math.min(dp[i], dp[i-coins[j]]+1);
}
}
return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];
}