[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

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

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 解题报告

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

Leetcode 377. Combination Sum IV

题目链接:Combination Sum IV Given an integer array with all positive numbers and no duplicates, find the...
  • xindoo
  • xindoo
  • 2016年07月27日 20:44
  • 727

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的种类数。注意,不同的排序也是不同的种类。                ...
  • isNoel
  • isNoel
  • 2016年11月16日 10:01
  • 119

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

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

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] 377.Combination Sum IV
举报原因:
原因补充:

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