问题描述: 如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 将问题进行抽象,最后达到什么程度了,给出任意面值集合V,凑够的面值为m,求所需硬币最少的个数 j. 如果没有任何一种零钱组合能组成总金额,返回-1。 举例一: 输入 V={1, 2, 5},m=11 输出 3 (5+5+1共三枚硬币) 举例二: 输入 V={2},m=3 输出 -1(无法兑换) 举例三: 输入 V={83, 186, 408, 419},m=6249 输出 20 代码实现:
public int changeCoin(int[] coins, int amount) { if(coins == null || coins.length == 0 || amount <= 0) return 0; int [] minNumber = new int[amount + 1]; for(int i = 1; i <= amount; i++) { minNumber[i] = amount + 1; for(int coin : coins) { if(i >= coin && minNumber[i - coin] + 1 < minNumber[i]) minNumber[i] = minNumber[i - coin] + 1; } } if(minNumber[amount] == amount + 1) return -1; else return minNumber[amount]; }