换钱的方法数-Java:暴力递归的方法

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net

package live.every.day.ProgrammingDesign.CodingInterviewGuide.RecursionAndDynamicPrograming;

/**
 * 换钱的方法数
 *
 * 【题目】
 * 给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim
 * 代表要找的钱数,求换钱有多少种方法。
 *
 * 【难度】
 * 中等
 *
 * 【解答】
 * 首先介绍暴力递归的方法。定义递归函数process1(arr,index,aim),它的含义是如果用arr[index..N-1]这些面值的钱组成
 * aim,返回总的方法数。具体实现参见如下代码中的coins1方法。
 *
 * @author Created by LiveEveryDay
 */
public class ChangeMoneyMethodNumberSolution1 {

    public static int coins1(int[] arr, int aim) {
        if (arr == null || arr.length == 0 || aim < 0) {
            return 0;
        }
        return process1(arr, 0, aim);
    }

    private static int process1(int[] arr, int index, int aim) {
        int res = 0;
        if (index == arr.length) {
            res = aim == 0 ? 1 : 0;
        } else {
            for (int i = 0; arr[index] * i <= aim; i++) {
                res += process1(arr, index + 1, aim - arr[index] * i);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        int[] arr = {2, 5, 3};
        int aim = 10;
        System.out.printf("The method number is: %d", coins1(arr, aim));
    }

}

// ------ Output ------
/*
The method number is: 4
*/

你可能感兴趣的:(#,Coding,Interview,Guide,换钱的方法数,暴力递归的方法)