通过计算所有从0到maxChange地最佳找零,并保存信息用来构造实际的硬币序列以解决找零问题的动态规划算法
package com.dynamic.cc;
/***
*
* @author SunnyBoy
*
*/
public class GiveChange {
public static void main(String[] args) {
int[] coins = { 1, 2, 5, 10, 20, 50, 100 };
int differentCoins = 7;
int maxChange = 3;
int[] coinsUsed = new int[maxChange + 1];
int[] lastCoin = new int[maxChange + 1];
makeChange(coins, differentCoins, maxChange, coinsUsed, lastCoin);
for (int i = 1; i < lastCoin.length; i++) {
System.out.println(i + ":" + coinsUsed[i]);
}
}
/***
* Dynamic programming algorithm to solve change-making problem.
* 从开始逐渐的构造数组coinsUsed寻找实际要求的找零钱的最佳找零
* @param coins
* @param differentCoins
* @param maxChange
* @param coinsUsed
* @param lastCoin
*/
private static void makeChange(int[] coins, int differentCoins, int maxChange, int[] coinsUsed, int[] lastCoin) {
coinsUsed[0] = 0;
lastCoin[0] = 1;
for (int cents = 1; cents <= maxChange; cents++) {
int minCoins = cents;
int newCoin = 1;
for (int j = 0; j < differentCoins; j++) {
if (coins[j] > cents)
continue;
if (coinsUsed[cents - coins[j]] + 1 < minCoins) {
minCoins = coinsUsed[cents - coins[j]] + 1;
newCoin = coins[j];
}
}
coinsUsed[cents] = minCoins;
lastCoin[cents] = newCoin;
}
}
}