经典动态规划(一)找零钱问题
前言 :实习期间都在做业务,降低了对算法题编程的练习。回来秋招答笔试题,遇到动归的题做得细碎,所以趁着还有一点时间把经典的动归问题用最通俗的话总结一下,顺便自己也捡捡编程能力。 动态规划的基本概念实际中就是如下几个步骤: a.分析最优解的性质,并刻画结构特征。 b.递归定义的最优解 c.以自底向上或自顶向下的方式计算出最优解 d.根据计算优值得到的信息,构造问题的最优解。 问题描述: 有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。 测试样例: n=3,aim=,penny【2,1,4】 返回值为 : 9 解析: 首先,我们从题目中可以得知我们有3种不同面值的货币,和要达到找钱的目标(aim)。 其次,我们可以将找钱的任务划分成如下的小任务。以3种货币种类举例。 大致的想法就是我就用一种货币去凑0~aim的面值。看看当使用一种货币的时候,从0~aim这些面值中每种面值的零钱换钱方法有多少种。之后,我在第一种货币的基础上增加第而种货币,这时候问题就变为使用使用两种货币的时候,从0~aim这些面值中每种面值的的零钱换钱方法有多少种。在这个时候我们会发现,对于一个面值而言,它的换钱的方法是包括两方面。一方面是使用一种货币的进行兑换的方法数量