文章目录
- 题目描述
- 法一 回溯
题目描述
法一 回溯
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);//试探每一值开始有没有可能构成targetdfs(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;}
};