当前位置: 代码迷 >> 综合 >> leetcode_48 Combination Sum IV
  详细解决方案

leetcode_48 Combination Sum IV

热度:53   发布时间:2024-01-31 09:37:51.0

题目:

Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.

Example:

nums = [1, 2, 3]
target = 4The 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?

 

方法一:回溯法 TLE

1.可以无限次使用元素

2.不同排列算作不同

3.没有重复元素

4.返回组合个数

class Solution {
public:vector<vector<int> > res;void tracebackComSum(vector<int> &nums, vector<int> &comb, int target){if(target <=0 ){if(target == 0)res.push_back(comb);return;}for(int i = 0; i < nums.size(); i++){comb.push_back(nums[i]);tracebackComSum(nums,comb,target-nums[i]);comb.pop_back();}}int combinationSum4(vector<int>& nums, int target) {vector<int> Comb;res.clear();tracebackComSum(nums,Comb,target);return res.size();}
};

方法二:动态规划

testcase [3,33,333]  10000   出现以上错误,把 int 改为unsigned int  

class Solution {
public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned int> dp(target + 1);dp[0] = 1;sort(nums.begin(),nums.end());for(int i = 1;  i <= target; i++){for(auto num:nums){if(i < num)break;dp[i] = dp[i] + dp[i - num];}}return dp.back();}
};

 

  相关解决方案