这个使用带记忆的 DFS 的 Coin Change 解决方案有什么问题?

What is wrong with this Coin Change solution using DFS with memoization?

我在 Python 中用 DFS + memoization 方法解决了 Leetcode 的 Coin Change 2 问题,解决方案如下

# O(m*n)
def change(amount: int, coins: List[int]) -> int:
    cache = {}
    
    def dfs(i, a):
        if a == amount:
            return 1
        
        if a > amount:
            return 0
        
        if i == len(coins):
            return 0
        
        if (i, a) in cache:
            return cache[(i, a)]

        cache[(i, a)] = dfs(i, a + coins[i]) + dfs(i + 1, a)
        
        return cache[(i, a)]
    
    return dfs(0, 0)

作为 C++ 新手,我一直在通过将我的 Leetcode Python 解决方案转换为 C++ 解决方案来练习我的 C++。这就是我所做的:

int dfs(int index, int a, int amount, vector<int> coins, vector<vector<int>>& dp) {
    if (a == amount) {
        return 1;
    }
    if (a > amount) {
        return 0;
    }
    if (index == coins.size()) {
        return 0;
    }
    
    if (dp[index][amount] != -1) {
        return dp[index][amount];
    }
    
    dp[index][amount] = dfs(index, a + coins[index], amount, coins, dp) + dfs(index + 1, a, amount, coins, dp);

    return dp[index][amount];
}

int change(int amount, vector<int>& coins) {
    int n = coins.size();
    vector<vector<int>> dp(n,vector<int>(amount+1, -1));
    return dfs(0, 0, amount, coins, dp);
}

我一辈子都弄不明白为什么我的 C++ 解决方案没有像我的 Python 解决方案那样通过所有测试用例。我觉得我对 C++ 知识的缺乏让我很难弄清楚为什么我的 C++ 实现是错误的。

测试用例示例:

5
[1,2,5]

应该return4.

您在 C++ 解决方案中的记忆化查看 indexamount(常量),而您的 Python 则查看 indexa .

相应地更改它可以修复它,即

[...]

    if (dp[index][a] != -1) {
    return dp[index][a];
}

dp[index][a] = dfs(index, a + coins[index], amount, coins, dp) + dfs(index + 1, a, amount, coins, dp);

return dp[index][a];

[...]