题目:换钱的方法数
给定数组 arr, arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。
将原文的伪代码进行C++实现
程序员代码面试指南第四章递归和动态规划 点击打开链接
例1:arr = [5, 10, 25, 1] ,aim = 15, 6种方法
1) 3张5元; 2)1张10元+1张5元; 3)1张10元+5张1元; 4)10张1元+1张5元;5)2张5元+5张1元; 6)15张1元
注:暴力递归和记忆化搜索方法,见前文 动态规划C++实现--换钱的方法数(一)(暴力递归 和 记忆化搜索)
总结:
- 暴力递归 时间复杂度 O(aim^N)
- 记忆化搜索 时间复杂度 O (N*aim^2)
- 动态规划 时间复杂度 O (N*aim^2)
- 改进动态规划 时间复杂度 O (N*aim) 额外空间复杂度 O (N*aim)
- 压缩空间的动态规划 时间复杂度 O (N*aim) 额外空间复杂度 O (aim)
3、动态规划
动态规划方法,生成函数为 N、列数为 aim+1的二