题目大意:
给予n,m 在 n 中选 m 个数,进行组合(从小到大)
输出按照让字典序最小
解题思路:
利用递归思想,从小到大递归(保证字典序最小),利用两个变量u,sta,u代表位数,sta代表当前位置的值的大小(让下一位比他大,就实现了单增),然后可以进行剪枝。(如果后面数值的数量不够,那么直接返回)
(关键点添加在注释中)
代码:(借鉴Acwing的y总)
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 30;
int n , m;
int way[N]; //存储值
void dfs(int u,int sta){ // u 是个数 , sta 是当前位置的值
if ( n - sta + u < m) return; // 剪枝(后面数值不够)
if ( u > m ){
for (int i = 1; i <= m; i++){
printf("%d ",way[i]);
}
puts("");
return ;
}
for (int i = sta; i <= n; i ++){
way[u] = i;
dfs(u + 1, i + 1); // i + 1 是关键,保证后面的大于前面的
way[u] = 0; // 恢复现场(本题可省略)
}
}
int main(){
scanf("%d%d",&n,&m);
dfs(1,1);
return 0;
}