文章目录
- 题目描述
- 法一 回溯
题目描述
法一 回溯
class Solution{
public:
vector<pair<int, int>>freq;
vector<vector<int>> res;
vector<int> seq;
void dfs(int pos, int rest){
//如果目标值为0,说明可能有一个组合或者rest本身为0 压入二维数组
if(rest==0){
res.push_back(seq);
return;
}
//如果到末尾了,或者第一个数值就比目标值大,直接返回
if(pos==freq.size() || rest<freq[pos].first){
return;
}
dfs(pos+1, rest);
int most = min(rest / freq[pos].first, freq[pos].second);
for(int i=1;i<=most;i++){ //注意这从1开始 因为后边有乘法
seq.push_back(freq[pos].first);
//试探每一值开始有没有可能构成target
dfs(pos+1, rest-i*freq[pos].first);
}
for(int i=0;i<most;i++){
seq.pop_back(); //清空seq
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target){
sort(candidates.begin(), candidates.end());
for(auto num:candidates){
if(freq.empty() || num!=freq.back().first){
freq.emplace_back(num, 1); //其中1用来指定 num 对应的值的初始数量
} else {
freq.back().second++;
}
}
dfs(0, target);
return res;
}
};