Leetcode #377 动态规划逻辑题

Leetcode #377 Dynamic Programming Logic Question

我一直在努力理解 LC #377 中显示的讨论解决方案之一。我不明白结果是如何增加的。我可以看到有一行:

result += combinations(nums, dp, target - nums[i])

这显然是递增结果,但是结果究竟是如何递增的?我所看到的是结果被初始化为 0 然后如果条件是则执行该行满意,所以不会行:

dp[target] = result

总是设置为 0?。真的很难理解,所以不胜感激。

代码:

class Solution {
public int combinationSum4(int[] nums, int target) {
    int[] dp = new int[target + 1];
    Arrays.fill(dp, -1);
    dp[0] = 1;
    return combinations(nums, dp, target);
}

public int combinations(int[] nums, int[] dp, int target) {
    if (dp[target] != -1) {
        return dp[target];
    }
    int result = 0;
    for (int i = 0; i < nums.length; i++) {
        if (target >= nums[i]) {
            result += combinations(nums, dp, target - nums[i]);
        }
    }
    dp[target] = result;
    return result;
}

}

重点回复您关于 result 递增的问题。 这是您提到的代码:

    int result = 0;
    for (int i = 0; i < nums.length; i++) {
        if (target >= nums[i]) {
            result += combinations(nums, dp, target - nums[i]);
        }
    }
    dp[target] = result;

有一个 for 循环将 i0 递增到 nums.length-1。对于每个这样的 i,如果满足此条件 (target >= nums[i]),则每次调用 combinations(nums, dp, target - nums[i]) 都会更新 result。您可以从签名中看到 combinations() returns 一个 int 值。

当达到 dp[target] = result 时,result 包含对 combinations().

的每次调用返回的值的总和

以下代码可能对您有所帮助。它计算 1n 之间的偶数总数。我写它是为了匹配您 post 中使用的递归风格。希望对你有帮助。

public class SumDemo {
    int checkEven(int n) {
        return (n % 2 == 0) ? 1 : 0;
    }

    int countEven(int n) {
        int result = 0;
        for (int i = 1; i <=n; i++) {
            result += checkEven(i);
        }
        return result;
    }

    public static void main(String[] args) {
        SumDemo demo = new SumDemo();
        System.out.println(demo.countEven(10));
    }
}

Result:
5

(因为1到10之间有5个偶数(包括)): 2, 4, 6, 8, 10