#include <iostream>
#include <vector>
using namespace std;
vector<int> arr; // 用于存储组合的动态数组
void backtracking(int n, int m, int stackindex) {
if (arr.size() == m) {
// 如果数组大小等于m,表示找到了一个组合
for (int j = 0; j < m; ++j) {
if (j == m - 1) {
// 如果是最后一个元素,换行输出
cout << " " << arr[j] << endl;
} else {
// 否则输出元素并添加空格
cout << " " << arr[j];
}
}
return;
}
// 使用回溯法生成组合
for (int i = stackindex; i <= n; ++i) {
arr.push_back(i); // 将当前元素加入组合
backtracking(n, m, i + 1); // 递归调用,继续生成下一个元素
arr.pop_back(); // 回溯,移除当前元素,尝试其他可能的元素
}
}
int main() {
int n, m;
cin >> n >> m;
backtracking(n, m, 1); // 调用回溯函数生成组合
return 0;
}
这段代码使用回溯法生成从 1 到 n 的数字中长度为 m 的所有组合。下面是大致的思路:
-
头文件和命名空间:
- 引入
<iostream>
和<vector>
头文件。 - 使用
using namespace std;
表示使用标准命名空间。
- 引入
-
全局变量:
vector<int> arr;
用于存储生成的组合。
-
回溯函数
backtracking
:- 参数:
n
是可选的最大数字,m
是组合的长度,stackindex
是当前数字的索引。 - 如果
arr
的大小等于m
,表示找到一个组合,将其输出。 - 否则,从
stackindex
到n
的范围内选择一个数字,加入arr
中,然后递归调用backtracking
生成下一个数字。 - 在递归完成后,回溯移除当前数字,尝试其他可能的数字。
- 参数:
-
主函数
main
:- 读取用户输入的
n
和m
。 - 调用
backtracking
函数,开始生成组合。
- 读取用户输入的
该程序使用回溯法从 1 到 n 的数字中生成长度为 m 的所有组合,输出这些组合。回溯法是一种通过尝试所有可能的组合来解决组合问题的算法。