[leetcode] 377.Combination Sum IV

原创 2016年08月30日 11:29:40

Example:

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

The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)

Note that different sequences are counted as different combinations.

Therefore the output is 7.

Follow up:
What if negative numbers are allowed in the given array?
How does it change the problem?
What limitation we need to add to the question to allow negative numbers?

解题思路:
使用递归的方法做这个题会超时,
因此根据这道题的解法提示选择使用DP的方法,这时我们需要一个一维数组dp大小为target+1,从对应dp[i]存储的是目标i时所得的组合数,然后我们从dp[1]开始计算直到dp[target],每次计算dp[i]时的方法是,从头开始遍历nums数组,如果i>=nums[j], dp[i] = dp[i] + dp[i-nums[j]],
(比如题目中的例子[1,2,3]
计算dp[1] :
从头开始遍历nums
当j =0时 因为1 >= nums[0] 故 dp[1] = dp[1]+dp[1- nums[0]],即
dp[1] = dp[1]+dp[0] = 1;
当j=1 时 因为1 < nums[1] 故 不再运算 故dp[1] = 1;
计算 dp[2]:
当j =0时 因为2 >= nums[0] 故 dp[2] = dp[2]+dp[2- nums[0]],即
dp[2] = dp[2]+dp[1] = 1;
当j =1时 因为2 >= nums[1] 故 dp[2] = dp[2]+dp[2- nums[1]],即
dp[2] = dp[2]+dp[0] = 2;
当j=2 时 因为2 < nums[2] 故 不再运算 故dp[2] = 2;
….
…..
….)

具体代码如下:

public class Solution {
    public int combinationSum4(int[] nums, int target) {
        int result  = 0;

        int[] dp = new int[target+1];
        dp[0] = 1;

        for(int i = 1; i < target + 1; i++) {
            for (int num : nums) {
                if(i >= num){
                    dp[i] = dp[i] + dp[i - num];
                }else{
                    break;
                }
            }
        }

        result = dp[target];
        return result;
    }
}

参考: http://www.cnblogs.com/grandyang/p/5705750.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[leetcode] 377. Combination Sum IV 解题报告

题目链接: https://leetcode.com/problems/combination-sum-iv/ Given an integer array with all positiv...

377. Combination Sum IV-动态规划

Given an integer array with all positive numbers and no duplicates, find the number of possible comb...

leetcode 377 Combination Sum IV 动态规划

377. Combination Sum IV   Question Editorial Solution  My Submissions Total A...

Leetcode 377. Combination Sum IV

大概题意为:给定一个正整数集合S,与一个正整数target。求从集合S中取出若干个数,可重复使用,使得它们的和为target的种类数。注意,不同的排序也是不同的种类。                ...

leetcode 377. Combination Sum IV 换钱问题

Given an integer array with all positive numbers and no duplicates, find the number of possible comb...

leetcode_middle_35_377. Combination Sum IV

题意: 给定一个不重复的正整数数组和一个正整数,找出数组的数相加等于这个正整数的可能组合数。(组合中的数字可以重复,可以不必使用所有数组的数,不同顺序各算一种) 分析: 我们要得出之和的可能数,就是要...

leetcode-377. Combination Sum IV

Given an integer array with all positive numbers and no duplicates, find the number of possible comb...

377. Combination Sum IV

解题思路: 该题对时间有要求,我们使用之前用过的回溯法将会超时。因为回溯法遍历所有种可能,类似于穷举,时间效率肯定不高。 换个思路,我们采用动态规划的思想来看看。 动态规划状态方程: dp[t...

leetcode【39+40+216+377 Combination Sum 相关】【python】

39Combination Sum是说让我们在给定数组C中找到所有的组合,使得组合中数字的和是target值。并且组合里的数字可以重复,也就是不限制C中每一个数字的使用。 这明显是回溯啦,大家记得让...

『Leetcode』Combination Sum IV

Given an integer array with all positive numbers and no duplicates, find the number of possible comb...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)