难度中等
给你一个由 不同 整数组成的数组 nums
,和一个目标整数 target
。请你从 nums
中找出并返回总和为 target
的元素组合的个数。
题目数据保证答案符合 32 位整数范围。
思路一:
递归方式求出全部的解决方式:
但是递归方式针对部分案例会导致超时。 案例: 【1,2,3】 32 超时
代码:
int ans = 0;
void getAns(vector<int>& nums, int target, int cur){
if(cur == target) ans++;
if(cur>target) return;
for(int i=0;i<nums.size();++i){
getAns(nums, target, cur+nums[i]);
}
}
int combinationSum4(vector<int>& nums, int target) {
for(int i=0;i<nums.size();++i){
getAns(nums,target,nums[i]);
}
return ans;
}
思路二:
采用动态规划的方式,依次计算目标数据为 0 到 target 之间时可能的组合数
某一目标数据的全部组合情况的计算方式如下 :
若当前数据为 cur,遍历0~cur,target[i] = target[i] + target[cur],最后target[i] 的结果为 目标数据为 i 时的全部组合结果。
注:需要额外考虑 超出数据范围的情况(数据反向溢出)。
代码:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1);
dp[0]=1;
for(int i=1;i<=target;++i){
for(int j=0;j<nums.size();++j){
if(nums[j] <= i && dp[i-nums[j]] < INT_MAX - dp[i]){
dp[i]+=dp[i-nums[j]];
}
}
}
return dp[target]
}