给定一个无重复元素的数组
candidates
和一个目标数target
,找出candidates
中所有可以使数字和为target
的组合。
candidates
中的数字可以无限制重复被选取。说明:
- 所有数字(包括
target
)都是正整数。- 解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入:candidates = [2,3,5], target = 8
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate
中的每个元素都是独一无二的。1 <= target <= 500
写出来AC代码之后。。。自己看了半天 这为啥能过呀。。
搞了半天越看越牛逼,我都不知道咋想的这个方法,复杂了好多
直接回溯搜它,每个数都可能选或者不选,选可以选多个
在选某个值选多个的时候target的值保持不变传过去,因为后面直接操作他(主要是因为上限的问题,如果更改target选的个数就会变化了,当然也可以加个其他的变量)
class Solution {
public:
vector<vector<int>> vec;
void dfs(int x,int i,vector<int>& candidates, int target,vector<int> temp){
if(x == candidates.size()) return ;
if(target < 0) return;
else{
int fz = target;
if(i > target/candidates[x]) return ;
if(i) temp.push_back(candidates[x]),fz -= i * candidates[x];
// cout<<i<<endl;
if(fz == 0){
// cout<<x<<" "<<i<<" "<<fz<<endl;
vec.push_back(temp);
return ;
}
if(fz < 0 ) return;
dfs(x,i+1,candidates,target,temp);
dfs(x+1,0,candidates,fz,temp);
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> temp;
dfs(0,0,candidates,target,temp);
return vec;
}
};