暴搜:考虑搜索顺序(按什么顺序搜可以不重不漏) (2 3 6 7–7) 从前往后看每个数,枚举每个数选多少个,记录下方案(用path[])
class Solution {
public:
vector<vector<int>> ans; // 答案用全局变量记录
vector<int> path; // 方案也记录在全局变量
vector<vector<int>> combinationSum(vector<int>& c, int target) {
dfs(c, 0, target); // 从前往后dfs, 0:先枚举第一个数(当前枚举到第几个数),targe:当前要凑的数
return ans; //枚举完后返回ans
}
void dfs(vector<int>& c, int u, int target) { //u:当前枚举到第几个数了,target:剩余需要凑的数(每凑一个数,就从target中减一个数)
if (target == 0) { // 如果已把target减成0了
ans.push_back(path); //说明已经把方案凑出来了,把当前方案移到答案中去并return
return ;
}
if (u == c.size()) return ; //如果说当前已枚举完最后一个数还没有凑出target,说明当前无解,直接return
for (int i = 0; c[u] * i <= target; i ++) { // 最后枚举当前数选几个(可选0个)
dfs(c, u + 1, target - c[u] * i); //c[u] * i <= target 要保证选i个c[u] 不能超过target,先dfs,是因为最开始选0个c[u],不用记录在方案中,直接dfs()到下一层,dfs(c,u+1,target-c[u]*i)
path.push_back(c[u]); //选几个c[u],就把它加入path[]中
}
for (int i = 0; c[u] * i <= target; i ++) // 恢复现场
path.pop_back();
}
};