递归实现组合型枚举
剪枝:
判断这条路能不能走通,如果不能就直接中断,剪断这条路
题目如下:
从 1∼n这 n 个整数中随机选出 m 个,输出所有可能的选择方案。
输入格式
两个整数 n,m ,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行 1 个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7
排在 1 3 6 8
前面)。
数据范围
n>0
0≤m≤n
n+(n−m)≤25
解答代码如下:
//用优先队列
#include<iostream>
#include<cstring>using namespace std;const int N = 25;int n,m;
int p[N];
bool st[N];void dfs(int u,int start)
{if (u + (n-start+1) < m)//剪枝return ;if (u == m){for (int i = 0;i<m;++i)cout << p[i] << " ";cout << endl;return ;}for (int i = start;i<=n;++i){p[u] = i;dfs(u+1,i+1);//实现从小到大的排列p[u] = 0;}}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m;dfs(0,1);return 0;
}
(1)剪枝
(2)dfs(u+1,i+1)