[0/1背包问题的动态规划法求解,前人之述备矣,这里所做的工作,不过是自己根据理解实现了一遍,主要目的还是锻炼思维和编程能力,同时,也是为了增进对动态规划法机制的理
算法描述:
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。基本思想也是将待求解问题分解成若干个子问题,先求解子问题,并将子问题的结果保存下来,然后从这些子问题的解得到原问题的解。动态规划实质上是一种以空间换时间的技术,[假设cNums[i]是记录了需要的最少硬币数来找零i元的。那么如果我们使用面值是x的硬币来找零,那么现在我们就需要 cNums[i] = 1+cNums[i-x]; 记得i是总钱币数,需要减少x,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法。
问题描述:
现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?
解题思路:
1,找出面值最接近T的硬币V
2,将f(T)问题的求解转换成f(T-V)+1问题的求解,以此出现递归
代码实现:
CoinChange类用于处理硬币找零的业务:
public class CoinChange {
/**
* 获取找零硬币个数
* @param coinValue 硬币的面值
* @param totalValue 需要找零的钱数</