93. 递归实现组合型枚举 (DFS + 剪支)

news/2024/7/20 23:11:25 标签: 深度优先, 算法, c++

93. 递归实现组合型枚举

题目链接
从 1∼n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。

输入格式
两个整数 n,m ,在同一行用空格隔开。

输出格式
按照从小到大的顺序输出所有方案,每行 1 个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。

数据范围

n>0 ,
0≤m≤n ,
n+(n−m)≤25

输入样例:

5 3

输出样例:

1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

题目分析
在这里插入图片描述

  1. 当前位置应该放哪一个数,当前的数应该放在哪一个位置
  2. 当前枚举到哪一个位置了
  3. 当前可以枚举的最小的数

x 表示当前枚举的位置
y 表示当前可以枚举的最小的数

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<sstream>

using namespace std;
typedef long long ll;
const int N=30;

int n, m;
int res[N];

void dfs(int x, int y) 
{
	if(x == m) 
	{
		for(int i = 0; i < m; i ++ )
			cout << res[i] << ' ';
		cout << endl;
		return ;
	}

	for(int i = y; i < n; i ++ ) 
	{
		res[x] = i + 1;
		dfs(x + 1, i + 1);
	}
}

int main() 
{
	cin >> n >> m;
	dfs(0, 0);
	return 0;
}



剪支:剪支就是在 DFS 的时候,当遇到无解的情况就直接结束,不再进行继续递归,以减少时间
假设我们正要选择第 x 个数,也就是说,我们已经选好了 x - 1 个数了,如果从剩下的 y 到 n 个数中无法选出 x 个数,那么这一条递归就是一定是无解的
无解:( x - 1 ) + ( n - y + 1 ) < m

剪支后的代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<sstream>

using namespace std;
typedef long long ll;
const int N=30;

int n, m;
int res[N];

void dfs(int x, int y) 
{
	if(x + n - y < m) return ;
	if(x == m) 
	{
		for(int i = 0; i < m; i ++ )
			cout << res[i] << ' ';
		cout << endl;
		return ;
	}

	for(int i = y; i < n; i ++ ) 
	{
		res[x] = i + 1;
		dfs(x + 1, i + 1);
	}
}

int main() 
{
	cin >> n >> m;
	dfs(0, 0);
	return 0;
}



剪支前与剪支后的时间比较
剪支前
在这里插入图片描述

剪支后
在这里插入图片描述
可以明显看出,时间快了一倍多


http://www.niftyadmin.cn/n/1680835.html

相关文章

字符串处理_编程实现字符串处理函数的功能(2)

编程实现字符串处理函数的功能&#xff0c;既有助于对字符串函数功能的理解&#xff0c;又有助于进一步巩固三种基本结构及字符数组&#xff0c;今天推送编程实现strcmp、strcpy字符串函数处理功能。4.strcmp函数----字符串比较函数/*strcmp函数----字符串比较函数*/#include v…

Linux 小知识翻译 - 「小型移动式PC」

这次介绍下新闻上提到的「小型移动式PC」。&#xff08;这个当时日本新闻上的内容&#xff09; 最近&#xff0c;经常在日本的大卖场中看到一种小型的移动式PC。不仅是小巧方便携带&#xff0c;而且价格也便宜。而且&#xff0c;省电功能的加入&#xff0c;使电池能工作更长的时…

过渡效果_vue 过渡是淡入淡出的效果的解读

在过渡过程中&#xff0c;提供6个类名供其切换选择&#xff1a;1、v-enter&#xff1a;定义进入过渡的开始状态。(在元素被插入之前生效&#xff0c;在元素被插入之后的下一帧移除)&#xff1b;2、v-enter-active&#xff1a;定义进入过渡生效时的状态。(在整个进入过渡的阶段中…

1209. 带分数(dfs + 剪支)

1209. 带分数 题目链接 100 可以表示为带分数的形式&#xff1a;100369258 / 714 还可以表示为&#xff1a;100823546 / 197 注意特征&#xff1a;带分数中&#xff0c;数字 1∼9 分别出现且只出现一次&#xff08;不包含 0&#xff09;。 类似这样的带分数&#xff0c;100 有…

用c语言给5个整数排序,刚学c语言,老师让用if编一个五个数字从大到小的排序,有那个大神能帮我,谢谢啦...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #define N 5int main(){int numbers[N];int i,j,pre,k;int x 5;int deletenumber; //需要删除的数值int deleteindex -1; //需要删除数值的下标int insertnumber;for(k0; k{scanf("%d",&numbers[k]);prin…

excel做ns流程图_Excel快速批量导入生产Cavns并生成图片下载到本地

有时候会有这样的需求吧有一个表格里面有一批数据需要批量生成封面我们在浏览器里可以批量生成比如我们有这样一个表格需要生成图书封面有三千多本书的话该怎么生成我们就可以这样做$.ajax({url: ssss.csv,dataType: text}).done(successFunction);function successFunction(da…

【初学菜鸟作--通过PXE与Kickstart网络无人值守装机】

通过PXE与Kickstart网络无人值守装机实验目的&#xff1a;通过PXE与Kickstart为服务器安装rhel5.9系统实验环境&#xff1a;创建有DHCP与DNS的rhel5.9系统服务器实验准备&#xff1a;1.网络参数设置2.拥有以5.9系统为基础的YUM库3.为服务器创建DHCP环境4.为服务器创建DNS环境5.…

717. 简单斐波那契(递推)

717. 简单斐波那契 题目链接 以下数列 0 1 1 2 3 5 8 13 21 ...被称为斐波纳契数列。 这个数列从第 3 项开始&#xff0c;每一项都等于前两项之和。 输入一个整数 N&#xff0c;请你输出这个序列的前 N 项。 输入格式 一个整数 N。 输出格式 在一行中输出斐波那契数列的前…