✨题目链接:
OR64 求和
✨题目描述
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来
✨输入描述:
每个测试输入包含2个整数,n和m
✨输出描述:
按每个组合的字典序排列输出,每行输出一种组合
✨示例1
📍输入
5 5
📍输出
1 4
2 3
5
✨解题思路
DFS+回溯
回溯逻辑:
- 如果
currentSum
等于m
,则将currentCombination
添加到结果集中,并返回。 - 如果
currentSum
大于m
或startIndex
大于n
,则剪枝,直接返回(因为不需要考虑更大的数字或索引超出范围的情况)。 - 否则,从
startIndex
开始,逐个尝试将数字加入currentCombination
,并递归调用回溯函数,传入下一个数字索引(startIndex + 1
)和更新后的currentSum
。
✨代码
#include <iostream>
#include <vector>
using namespace std;
void backtrack(int n, int m, int startIndex, int currentSum, vector<int>& currentCombination, vector<vector<int>>& results) {
if (currentSum == m) {
results.push_back(currentCombination);
return;
}
if (currentSum > m || startIndex > n) {
return;
}
for (int i = startIndex; i <= n; ++i) {
currentCombination.push_back(i);
backtrack(n, m, i + 1, currentSum + i, currentCombination, results);
currentCombination.pop_back(); // 回溯
}
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> results;
vector<int> currentCombination;
backtrack(n, m, 1, 0, currentCombination, results);
// 按字典序打印结果
for (const auto& combination : results) {
for (int num : combination) {
cout << num << " ";
}
cout << endl;
}
return 0;
}
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持