问题:
假如给你这些面值的硬币{25, 21, 10, 5, 1 },问需要对63进行找零,需要的最少硬币数为?
思路:
很明显的一个动态规划题目,该问题的子问题其实就是更小数额的钱需要的最少硬币数,那我们可以先从小数额开始计算,
这样后面大数额就可以借助前面已经计算好的小数额的来进行计算,
比如找零,21,前面已经计算了找零20需要2个硬币,这里21很明显就是2+1=3个硬币。
上代码:
public class DpCoins {
/**
* 硬币找零:动态规划算法
*
* @param values
* :保存不同硬币的币值的数组
* @param valueKinds
* :values数组的大小
* @param money
* :需要找零的面值
* @param coinsUsed
* :保存面值为i的纸币找零所需的最小硬币数
*/
public static void makeChange(int[] values, int valueKinds, int money,
int[] coinsUsed) {
coinsUsed[0] = 0;
// 对所有数额都找零(从小到大),即保存子问题的解以备用,即填表
for (int cents = 1; cents &l