题目描述:
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?
给定一个数组,求数组元素的组合,使得元素之和等于目标值,数组元素可以重复使用,元素顺序不同也视为不同组合。由于顺序不同也是不同组合,这样不便于使用递归,考虑动态规划。用dp[i]表示元素和为i的所有组合数目,那么对于nums[j]<=i,有递推关系dp[i]+=dp[i-nums[j]],同时需要定义dp[0]=1,这样才能让递推公式在nums[j]=i的时候仍然成立。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1,0);
dp[0]=1;
for(int i=1;i<=target;i++)
for(int j=0;j<nums.size();j++)
if(i>=nums[j]) dp[i]+=dp[i-nums[j]];
return dp[target];
}
};