给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
示例:
nums = [1, 2, 3]
target = 4
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。
因此输出为 7。
【思路】
本题自己其实已经快要想出来,都已经想到target做参数的那个点上了,但最后纠结到了一个问题上,死活走不出来,最后还是上网查了查。
思路其实还是用递归的角度来想,f(n)表示数字n的不同组合方式,f(n) = sum{ f(n - nums[k])}; 这是因为每次选择我都可以尝试所有的数
把边界一想好,递归程序就出来了。这题若直接用递归过不了,必须转成dp写法才能应付大数据
AC代码:
class Solution {
public:
vector<int> dp;
int f(vector<int>& nums, int t)
{
dp.push_back(1);
for(int i = 1;i <= t;i++)
{
long long int sum = 0;
for(int k = 0;k < nums.size();k++)
{
if(i - nums[k] >= 0)
sum += dp[i - nums[k]];
}
dp.push_back(sum);
}
return dp[t];
}
int combinationSum4(vector<int>& nums, int target) {
return f(nums, target);
}
};