这道题类似背包问题,取或不取,也可取多个,可以用自底向上的动态规划解决,首先可以将递归式列出。
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]; } }