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?
解法一:
recursive的思路,如果target和当前数字相等,则加1,否则用target-nuns[i]再次遍历。
不过这个方法不能通过OJ的runtime test。sigh。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int cnt = 0;
if (target<0) return cnt;
for(int i=0; i<nums.size(); ++i){
if(target==nums[i]) cnt++;
else cnt+= combinationSum4(nums,target-nums[i]);
}
return cnt;
}
};
解法二:
dp的思路。从数字1到target遍历一遍。对于没一个数字i,遍历数组。数组中每一个元素a组成i的方法数是dp[i-a]。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1);
dp[0]=1;
for(int i=1; i<=target; ++i){
for(auto a:nums){
if (i>=a) dp[i]+=dp[i-a];
}
}
return dp.back();
}
};