设dp[i] 为金额i所需的最小硬币个数,如果值是amount+1,表示没有任何一种硬币组合能组成金额i
递推公式为:dp[i] = Math.min( dp[i], dp(i-k)+1 ); k in coins, i>=k
初始值,dp所有元素为amount+1,即没有组合方式
自下向上的动态规划解法如下:
public class Test323_2 {
@Test
public void test() {
System.out.println(coinChange(new int[]{1, 7, 10}, 14));
System.out.println(coinChange(new int[]{5,7,9}, 14));
}
public int coinChange(int[] coins, int amount) {
int max = amount + 1;
int[] dp = new int[amount+1];
Arrays.fill(dp, max);
dp[0] = 0;
for(int i=1; i<=amount; i++) {
for(int k :coins) {
if(k<=i) {
dp[i] = Math.min(dp[i-k]+1, dp[i]);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}