题目链接
思路
- 这种题目可以无限选择,属于课重复选择的背包问题
- 可以令f(i)为凑成面值i所需要的最少硬币数,那么f(i)可以是f(i-coins[0])+1,也就是说在凑成面值为i-coins[0]的基础上再加1枚硬币,也可以是是f(i-coins[1])+1,也就是说在凑成面值为i-coins[1]的基础上再加1枚硬币
- 所以说 f(i) = min{f(i-coin)+1}
- 边界条件 f(0) = 0,当目标数值是0时0枚硬币就可以
- 还有一点在于初始化的值,把数组每个元素都初始化为amount+1 这样可以在最后判断出是否可以凑出amount,因为如果可以的话,最多的硬币个数就是amount
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp,amount+1);
dp[0] = 0;
Arrays.sort(coins);
for(int i = 1 ; i <= amount ; i++){
for(int coin:coins){
if(i >= coin)
dp[i] = Math.min(dp[i],dp[i-coin]+1);
else
break;
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}