1. 指数型升序枚举
指数型就是选数而不是选坑,如果是选坑的话肯定没有办法达到选任意个数的数
#include<vector>
#include<iostream>
using namespace std;
const int N = 15;
int n;
vector<int> v;
// 枚举每个数选不选
void dfs(int u)
{
if (u == n + 1)
{
for (int i = 0; i < v.size(); i ++) cout << v[i] << ' ';
cout << endl;
}
if (u > n) return;
v.push_back(u); // 选这个数
dfs(u + 1);
v.pop_back(); // 不选这个数
dfs(u + 1);
}
int main()
{
cin >> n;
dfs(1);
return 0;
}
2. 排列型组合型枚举(无顺序)
即$123$等价于$321$,不是排列组合
$1$是所有枚举类型,$2$是只要排列长度等于$m$的,所以只需要将长度小于$m$的和大于$m$的剪枝掉即可
注意剪枝小于$m$的方法:$num.size() + (n - u + 1) < m$,即当前已选的数和后面剩的数没办法凑够$m$个
#include<iostream>
#include<vector>
using namespace std;
const int N = 20;
int n, m;
vector<int> num;
void dfs(int u)
{
if(num.size() > m || num.size() + (n - u + 1) < m) return;
if (u == n + 1)
{
for (int i = 0; i < num.size(); i ++) cout << num[i] << ' ';
cout << endl;
return;
}
// 选这个数
num.push_back(u);
dfs(u + 1);
// 不选这个数
num.pop_back();
dfs(u + 1);
}
int main()
{
cin >> n >> m;
dfs(1);
return 0;
}
3. 组合型(排列组合)
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
bool st[N];
int path[N], cnt = -1, n;
void dfs(int u)
{
if (u == n)
{
for (int i = 0; i < n; i ++) cout << path[i] << ' '; cout << endl;
return;
}
for (int i = 1; i <= n; i ++)
if (!st[i])
{
st[i] = true;
path[++ cnt] = i;
dfs(u + 1);
st[i] = false;
cnt --;
}
}
int main()
{
cin >> n;
dfs(0);
return 0;
}
排列组合和枚举是不一样的!
排列组合选坑,枚举选数!