问题是这样的:假设我有多种面值的硬币,都不限量,此时给定我一个整数金额,怎么组合出最少硬币数?
public class DPCoin {
public static void getMinestCoinsNum(int[] coins, int coinsLength, int money) {
if(coins == null || coinsLength < 0 || money < 0)
return ;
int[] minCoins = new int[money+1];
minCoins[0] = 0;
for(int i = 1; i <= money; i++) { //从小到大遍历1元、2元...,i元,求取i元下需要的最少硬币个数
int min = i; //最小需要多少硬币,这里初始设置为最多的硬币个数,即都是1块钱硬币
for(int j = 0; j < coinsLength; j++) { //当前手上有一个coins[j]面值的硬币,那么求取i-coins[j]这个子问题所需要的最少硬币数
//求当前i下的所有子问题的最优解,比较得到i下的最优解
if(coins[j] <= i) { //如果手上硬币面值过大,兑换不了
int temp = minCoins[i-coins[j]] + 1; //temp就是i-coins[j]这个子问题所需要的最少硬币数 + 手上的coins[j]面值的硬币
if(min > temp)
min = temp;
}else break;
}
minCoins[i] = min; //当前如果收到i元,那么最少兑换的硬币个数就是min
if(i == money)
System.out.println(money + "元最少找钱硬币数为" + minCoins[i] + "个");
}
}
public static void main(String[] args) {
int[] coins = {1, 2, 5, 10, 12}; //硬币面值从小到大排序,否则子问题无法完全求解
int money = 101;
getMinestCoinsNum(coins, coins.length, money);
}
}