提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
任何一个动态规划都是某一种暴力递归的优化求解,故先从暴力递归开始做,改成记忆化搜索(傻缓存),再到动态规划
提示:以下是本篇文章正文内容,下面案例可供参考
一、例子
给一个数组,例如arr[]={2,3,5,10},2,3,5,10是钱数,给一个aim值,钱数可以任意张,问组成aim值的方法数
二、代码
1.暴力递归
代码如下(示例):
public static int ways(int[] arr, int aim) {
if (arr == null || arr.length == 0 || aim <= 0) {
return 0;
}
return process(arr, 0, aim);
}
//暴力递归
//在arr[index...]之后的钱中任意钱数拿任意张组成rest的方法数
public static int process(int[] arr, int index, int rest) {
//base case
if (rest < 0) {
return 0;
}
//rest>=0
if (index == arr.length) {
return rest == 0 ? 1 : 0;
}
//有rest且有钱币可拿的情况
int ways = 0;
for (int zhang