假设你要求63的最小硬币数,那么你需要这样计算:10-1=9、10-5=5、10-10=0。假设9、5、0对应的最小硬币数已经被你记录在了备忘录数组。这时候你只需要找出9、5、0中谁对应的最小硬币数最小,然后加1,就是10对应的最小硬币数。因为10比9、5、0都大,最好的情况无非就是在9、5、0中找出最小的一种情况加1,这就是最优解!
public class Main {
public static int changeMoney(int[] coin,int money) {
int[] memo=new int[money+1];
memo[0]=0;
for(int curMoney=1;curMoney<=money;curMoney++) {
int minCoins=curMoney;//最少硬币数初始值默认是money
for(int i=0;i<coin.length;i++) {//遍历硬币面值
if(curMoney>=coin[i]) {//如果当前钱数>=某一个硬币面值
int tmpCoins=memo[curMoney-coin[i]]+1;//当前的硬币数=(当前钱数-当前硬币面值)在数组中最少硬币数+1
minCoins=Math.min(minCoins, tmpCoins);//
}
}
memo[curMoney]=minCoins;
}
return memo[memo.length-1];
}
public static void main(String[] args) {
int money=10;
int[] coin= {1,5,10};
System.out.println(changeMoney(coin,money));
}
}
输出:1