找零问题之动态规划法求解
递归是从后往前逐步判断求解,17元有哪个和哪个组成,而哪个又由–和--组成,其实除了递归求解,也可以换种思路,从前往后逐步递推。
从小到大都求出来最优解,逐步递推。而大的最优解一定包含某个小的最优解(注意是某一个,这个是不确定的,用反证法),如果不包含,那必定还有一个解,这个解和最优解一定有一个是最优的,无论哪个都把之前的前提能够推翻。
比如,找零17元,面值有1,5,10,25四种金额。和递归一样,只不过是从小到大逐步求解(可以看成是递归的非递归形式)。
先求出找零1元的最优解,即1张1元。然后是2元,2元是由1元的最优解组成2张2元的,以此类推,找零5元,此时5元的最优解即变成1张5元,5元则是由5元的最优解组成,然后是6元,1张1元和1张5元,6元是在5元的最优解的基础上求出。
**那么到底如何求解呢?和递归的思路一样,还是上面的例子,已知有面值金额的种类,那么,比如找零7元,因为目前可选的只有面值1元和5元找零,所以最优解一定是1元和找零6元的最优解,或者是5元和找零2元的最优解。**其实就是把当前能够用面值金额直接找零的都算一遍,进行对比找出最小的。
为了保存,用一个列表存储每个值的找零数量最小值,为了存储找零方案,记录当前找零所用到的面值,(找零子集不用记录,比如找零7元,可以直接记录5,此时就代表用一张面值为5元的纸币,然后再直