跳过正文
题解:P10448 组合型枚举

题解:P10448 组合型枚举

xyx404
作者
xyx404
Have a nice day.

封面

思路:
#

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

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

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

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

完整代码:
#

#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;
}