Java 给硬币换零钱的方法有很多

Java 给硬币换零钱的方法有很多,java,recursion,memoization,Java,Recursion,Memoization,我试图用记忆和递归来解决硬币兑换的问题。但是我的代码中有一些小故障,它给了我错误的输出 public static int coinChangeMemo(int coins[], int n) { int [][] memo = new int[n+1][coins.length+1]; for (int row = 0; row < memo.length; row++) { for (int col = 0; col &l

我试图用记忆和递归来解决硬币兑换的问题。但是我的代码中有一些小故障,它给了我错误的输出

    public static int coinChangeMemo(int coins[], int n) {
        int [][] memo = new int[n+1][coins.length+1];
        for (int row = 0; row < memo.length; row++) {
            for (int col = 0; col < memo[row].length; col++) {
                memo[row][col] =-1; 
            } 
        }
        return coinChangeMemoHelper(coins, n, 0, memo);
    }


    private static int coinChangeMemoHelper(int coins[], int n, int index, int memo[][]) {
        if(n == 0) {
            return 1;
        }
        if(index >= coins.length) {
            return 0;
        }
        if(n <= 0) {
            return 0;
        }

        if(memo[n][index] != -1) {
            return memo[n][index];
        }
        int withUsingCurrent = coinChangeMemoHelper(coins, n-coins[0], index, memo);
        int withoutUsingCurrent  = coinChangeMemoHelper(coins, n, index+1, memo);

        memo[n][index] = withUsingCurrent + withoutUsingCurrent;
        return withUsingCurrent + withoutUsingCurrent;

    }

    public static void main(String[] args) {
        //coins denominations are 1, 2

        int coins[] = {1,2};
        //i want a change of 4 
        int sum = 4;

        System.out.println(coinChangeMemo(coins, sum));


public static int coinchangemo(int coins[],int n){
整数[][]备忘录=新整数[n+1][coins.length+1];
对于(int row=0;row=硬币长度){
返回0;
}

如果(n您需要对代码进行两次更改:-> 1.您可以将最后2个基本情况合并为:
如果(index==coins.length | |我不知道你的代码应该做什么,也不知道为什么它会返回3。如果你有值为1和值为2的硬币,并且你的金额为4,我希望它返回值为2的硬币2@Stultuske我想返回金额4的方式数。我已更新描述。我猜,您的代码将2,1,1-1,1,2-1,2,1视为不同的解决方案。