LeetCode-【动态规划】-组合总和 Ⅳ

版权声明:转载注明出处就可以了。。。 https://blog.csdn.net/zw159357/article/details/82663182

给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。

示例:

nums = [1, 2, 3]
target = 4

所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)

请注意,顺序不同的序列被视作不同的组合。

因此输出为 7。

进阶:
如果给定的数组中含有负数会怎么样?
问题会产生什么变化?
我们需要在题目中添加什么限制来允许负数的出现?

题解:很容易能想到递归加回溯解决,但可惜的是时间会超限,那只好采用动规解决了,那思路又是什么,动规一般是求什么设什么,所以只好设dp[i]是target为i的组成总数,它要怎么从之前的状态得到。动态规划的题目里有些是可以从dp[i-1]得到,而有些要从dp[0] ~ dp[i-1]来得到。这道题便是后者。当target是0,即i是0的时候,理解上dp[0]应该是0,但是这里要设置成1,是因为要把这个1想象成空集去组合其他的数。相应的dp[i]就是dp[i]加上dp[i-nums[j]](0=<j<n),这里i-nums[j]是小于i的数并且可通过加上num[j]变成i的数,dp[0]已经指定,所以依次往后推就能得到dp[target]的值。

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp=new int[target+1];
        for(int i=1;i<=target;i++)
            dp[i]=0;
        dp[0]=1;
        for(int i=1;i<=target;i++){
            for(int j=0;j<nums.length;j++){
                if(i>=nums[j])
                    dp[i]+=dp[i-nums[j]];
            }
        }
        return dp[target];
    }
}

猜你喜欢

转载自blog.csdn.net/zw159357/article/details/82663182