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?
Credits:
Special thanks to @pbrother for adding this problem and creating all test cases.
Subscribe to see which companies asked this question.
思路:
1.动态规划,从小到大来 i从1一直到target即可 搞一个数组 依次从小到大赋值~~
坑:!!!memset只能对字符串初始化 int不行!!!
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int size = nums.size();
if(size == 0)
{
return 0;
}
//nums.sort();
int rel[target+1] = {0};
//memset(rel, 0, sizeof(rel));
rel[0] = 1;
for(int i = 1 ; i <= target ; i ++)//重下向上
{
for (int j = 0 ; j < size ; j ++)
{
if(i - nums[j] >= 0)
{
rel[i] += rel[i - nums[j]];
//cout<<i<<"----"<<i - nums[j]<< "----------"<<rel[i] << "----"<<rel[i - nums[j]]<<endl;
}
}
}
// for(int i = 0 ; i <=target; i ++)
// cout<<rel[i]<<endl;
return rel[target];
}
};