1. 题目来源
前置:
这个标题应该最先被搜到吧,必看的相关题目:
- [Mdfs] lc39. 组合总和(dfs+经典)
- [Mdfs] lc40. 组合总和 II(dfs+经典)
- [Mdfs] lc46. 全排列(dfs+经典)
- [Mdfs] lc47. 全排列 II(dfs搜索顺序+去重处理+知识理解+经典)
- [Mdfs] lc77. 组合(组合类型枚举+题目总结+经典)
- [Mdfs] lc78. 子集(二进制枚举+排列类型枚举+经典)
- [Mdfs] lc90. 子集 II(组合类型枚举+多重背包+去重经典)
2. 题目解析
[Mdfs] lc77. 组合(组合类型枚举+题目总结+经典) 问题的简单拓展哈。
注意:
- 在此的 剪枝优化。
- 在此选择的数字只能在 1~9 之间。
至于 选不选 的写法,暂时略过吧。
代码:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void dfs(int sum, int u, int cnt, int k, int n) {
if (cnt == k && sum == n) {
res.push_back(path);
return ;
}
if (sum > n) return ;
if (k - cnt > n - u) return ;
for (int i = u; i <= 9; i ++ ) {
path.push_back(i);
dfs(sum + i, i + 1, cnt + 1, k, n);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
dfs(0, 1, 0, k, n);
return res;
}
};