题目:
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 = 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?
方法一:回溯法 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();
}
};