排列
 A n m A_n^m Anm
 输入:
 4 2
 输出:
 1 2
 1 3
 1 4
 2 1
 2 3
 2 4
 3 1
 3 2
 3 4
 4 1
 4 2
 4 3
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int n, m;
int a[100];
bool st[100];
void dfs(int u, vector<int>& path)
{if(u == m) {for(int i = 0; i < m; i++) {cout << path[i] << " ";}cout << endl;return;}for(int i = 0; i < n; i++) {if (st[i]) continue;st[i] = true;path.push_back(a[i]);dfs(u + 1, path);path.pop_back();st[i] = false;}
}int main() {cin >> n >> m;for(int i = 0; i < n; i++) a[i] = i + 1;vector<int> path;dfs(0, path);return 0;
}
组合
 C n m C_n^m Cnm
 输入:
 5 3
 输出:
 1 2 3
 1 2 4
 1 2 5
 1 3 4
 1 3 5
 1 4 5
 2 3 4
 2 3 5
 2 4 5
 3 4 5
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int n, m;
int a[100];void dfs(int u, vector<int>& path, int start)
{if(u == m) {for(int i = 0; i < m; i++) {cout << path[i] << " ";}cout << endl;return;}for(int i = start; i < n; i++) {path.push_back(a[i]);dfs(u + 1, path, i + 1);path.pop_back();}
}int main() {cin >> n >> m;for(int i = 0; i < n; i++) a[i] = i + 1;vector<int> path;dfs(0, path, 0);return 0;
}