C语言回溯法 实现组合数 从N个数中选择M个数

 更新时间:2018年08月11日 16:19:42   作者:Alger_jhun  
在平时的算法的题目中,时常会遇到组合数相关的问题,暴力枚举。在N个数中挑选M个数出来。利用for循环也可以处理,但是可拓展性不强,于是写这个模板供以后参考

前言

在平时的算法的题目中,时常会遇到组合数相关的问题,暴力枚举。在N个数中挑选M个数出来。利用for循环也可以处理,但是可拓展性不强,于是写这个模板供以后参考。

两个函数和全局变量可以直接用。

代码:

#include<iostream>
#include<cstdio>
 
#define N 10    //被选择的数目
#define M 5    //要选出来的数目
 
using namespace std;
int vis[N+1];    //标志,
int ans=0;    //含有的组合数 的数量
int num[M+1];    //选出来的数放在num数组里面
 
void solve() {        //在solve函数里面处理
	for(int i=1; i<M+1; i++)
		cout<<num[i]<<" ";
	cout<<endl;
}
 
void dfs(int index) {    //挑选的第index+1个数
	if(index == M) {
		solve();
		ans++;	
		return ;
	}
	for(int i=num[index]+1; i<N+1; i++) {
		if(!vis[i]) {
			vis[i] = 1;
			num[index+1] = i;
			dfs(index+1);
			vis[i] = 0;
		}
	}
}
 
int main()
{
	dfs(0);    //回溯开始
	cout<<endl<<ans;
	return 0;
}

可以发现利用回溯法挑选的有一个优势在于,输出的数组是经过排序的。

相关文章

  • C++实现LeetCode(94.二叉树的中序遍历)

    C++实现LeetCode(94.二叉树的中序遍历)

    这篇文章主要介绍了C++实现LeetCode(94.二叉树的中序遍历),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C/C++可变参数的使用

    C/C++可变参数的使用

    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    2013-09-09
  • 解析OpenSSL1.1.1 centos7安装编译aes的c++调用

    解析OpenSSL1.1.1 centos7安装编译aes的c++调用

    这篇文章主要介绍了OpenSSL1.1.1 centos7安装编译aes的c++调用,实现方法也很简单,主要是在该文档内加入openssl的lib路径,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • C++实现井字棋游戏

    C++实现井字棋游戏

    这篇文章主要为大家详细介绍了C++实现井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Qt实现简易秒表设计

    Qt实现简易秒表设计

    这篇文章主要为大家详细介绍了Qt实现简易秒表设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++中的覆盖和隐藏详解

    C++中的覆盖和隐藏详解

    这篇文章主要介绍了C++中重载、重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下,希望能够给你带来帮助
    2021-08-08
  • C语言实现成绩统计示例

    C语言实现成绩统计示例

    这篇文章主要介绍了C语言实现成绩统计示例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++类和对象之封装详解

    C++类和对象之封装详解

    大家好,本篇文章主要讲的是C++类和对象之封装详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言中判断两数组中是否有相同的元素

    C语言中判断两数组中是否有相同的元素

    下面是我在做IF语句练习时遇到的一个练习题,想要整理在博客上判断两个数组中是否有相同的元素,需要的朋友可以参考下
    2019-10-10
  • stl容器set,map,vector之erase用法与返回值详细解析

    stl容器set,map,vector之erase用法与返回值详细解析

    在使用 list、set 或 map遍历删除某些元素时可以这样使用,如下所示
    2013-09-09

最新评论