题解:P10448 组合型枚举

封面

思路:

使用 dfs 算法,创建一个数组存当前已经找到的数字。

深度优先搜索代码实现:传入的量为现在找的是第几个数,第一次传入的是一,表示现在找的是第一个数,当传入的数减一等于 mm 时输出。

输出函数实现:循环定义的 ii 表示当前已经找到的数字的数组的下标,如果你下标是从零开始存的就从零历遍到 m1m-1,如果是从一开始存的就从 11 历遍到 mm,注意不要忘了最后换行。

因为题目中要求字典序较小的排在前面,所以我们就不定义标记数组了,下一次搜索就直接从上一个数加一开始。

完整代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
ull n,m;
ull sc[30];// 存现在找到的数字
void print(){// 输出
for(int i=1;i<=m;i++)cout<<sc[i]<<" ";
cout<<"\n";
}
void dfs(int x){// 搜索
if(x-1==m){
print();return ;
}
for(int i=sc[x-1]+1;i<=n;i++){
sc[x]=i;
dfs(x+1);
}
}
int main(){
cin>>n>>m;// 输入
dfs(1);
return 0;
}