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.
源码:
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int size = nums.size();
if (size == 0)return 0;
vector<int>re(target + 1, 0);//全部置0
sort(nums.begin(),nums.end());
int min_value = *nums.begin();
re[min_value] = 1;
for (int i = min_value + 1; i <= target; i++){
for (int j = 0; j < size; j++){
if(i-nums[j]>=0)re[i] = re[i] + re[i - nums[j]];
}
if (find(nums.begin(), nums.end(), i) != nums.end())re[i]++;
}
return re[target];
}
};
Submission Result: Accepted More Details
Next challenges:
(M) Combination Sum
分析:
我们以上述例子来分析,当i=1时,此时只有一个组合的和等于1,那就是数组的第一个元素1;然后依次得到2的所有组合,它们关系如下:
sum=1
1
sum=2
1,1;
2;
sum=3
1,1,1;
2,1;
1,2;
3;
sum=4
1,1,1,1;
1,2,1;
1,1,2;
2,1,1;
3,1;
1,3;
2,2;
从上面的规律我们可以看出:当我们要求sum=4的时候的组合的数目,我们可以利用re[4]=sum(re[3]+1,re[2]+2,re[1]+1)这个表达式的意思就是:
我们在3的组合里的每一个排列后面加上1,就可以得到通过加1之后变成和为4的序列(注意这样做的前提是题目已经说明了每个数使用的次数不受限制,同一组合中哪怕是有相
同的数,只要它们的顺序不一样就是不同的组合,比如1,1,2和2,1,1)。但是这里有一个需要注意的是如果我们要求的i刚好和nums里的某个数相等,那么这个时候re[i]的个数
还要额外的+1,比如求re[3]的时候,数组里3那么就不需要re[1]+2,re[2]+1,这个时候直接一个3就行,这也是为什么很多版本里re[0]=1的原因!!!!!