这道题类似背包问题,取或不取,也可取多个,可以用自底向上的动态规划解决,首先可以将递归式列出。
F(0) = 0;
F(n) = Min{F(n - a[0]), F(n - a[1]), F(n - a[2]), ... F(n - a[a.length - 1])} + 1;
其中a为硬币数组。
代码如下:
class Solution {
public int coinChange(int[] coins, int amount) {
if(coins.length == 0 || coins == null) return -1;
int[] dp = new int[amount+1];
dp[0] = 0;
for(int i=1; i<=amount; i++){
int minCount = Integer.MAX_VALUE;
for(int j=0; j<coins.length; j++){
if(i >= coins[j] && dp[i - coins[j]] != -1){
minCount = Math.min(dp[i - coins[j]] + 1, minCount);
}
}
if(minCount == Integer.MAX_VALUE){
dp[i] = -1;
}else {
dp[i] = minCount;
}
}
return dp[amount];
}
}
京公网安备 11010502036488号