经典找零钱问题。领给你一个数组arr,和一个整数aim.如果可以任意选择arr中的数组,能不能累加得到aim.返回true或者false。左神版。
package 算法初级;
import tool.MyArraysTool;
/**
* @title 换零钱问题
* @description 给你一个数组arr,和一个整数aim,如果可以任意选择arr中的数字,判断能否累加到aim
* @thinking 1、暴力递归 2、动态规划
* @author xiaox
* @data 2018年5月20日
*/
public class Money_Problem {
/**
* 暴力递归
* @param arr 给定的零钱,
* @param 对 arr 数组从 0 到 arr.length - 1 的位置上做选择, i 记录当前选择到第几个位置了。
* @param aim 当前目标,当在 i 位置时候 当前待换的钱。
* @return
*/
public static boolean money(int[] arr, int i, int aim) {
if (aim == 0) {
return true;
}
if (i == arr.length) {
return false;
}
return money(arr, i + 1, aim - arr[i]) || money(arr, i + 1, aim);
}
/**
* 暴力递归->动态规划
* 可变参数 i 和 aim ,当两者的的值确定了 money(i, aim)的值就确定了。
* 1、建立二维数组res,i代表行, aim代表列; 行 < arr.length + 1 ; 列 < aim + 1;
* 2、要求位置:我们需要的位置是res[0]