题目:
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();}
};