C语言回溯法 实现组合数 从N个数中选择M个数
前言
在平时的算法的题目中,时常会遇到组合数相关的问题,暴力枚举。在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语言回溯法 实现组合数 从N个数中选择M个数
前言 在平时的算法的题目中,时常会遇到组合数相关的问题,暴力枚举.在N个数中挑选M个数出来.利用for循环也可以处理,但是可拓展性不强,于是写这个模板供以后参考. 两个函数和全局变量可以直接用. 代码: #include<iostream> #include<cstdio> #define N 10 //被选择的数目 #define M 5 //要选出来的数目 using namespace std; int vis[N+1]; //标志, int ans=0;
-
C语言回溯法解八皇后问题(八皇后算法)
八皇后问题(N皇后问题)的回溯法求解 一.问题描述 在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法,并推广到N皇后情况. 二.参考资料 啥文字都不用看,B站上有个非常详细的动画视频解说,上链接!!! Click Here! 三.源代码 #include<iostream> #include<vector> #include<string> using namespace std; void put_queen(int x, int
-
C++回溯法实例分析
本文实例讲述了C++的回溯法,分享给大家供大家参考之用.具体方法分析如下: 一般来说,回溯法是一种枚举状态空间中所有可能状态的系统方法,它是一个一般性的算法框架. 解向量a=(a1, a2, ..., an),其中每个元素ai取自一个有限序列集Si,这样的解向量可以表示一个排列,其中ai是排列中的第i个元素,也可以表示子集S,其中ai为真当且仅当全集中的第i个元素在S中:甚至可以表示游戏的行动序列或者图中的路径. 在回溯法的每一步,我们从一个给定的部分解a={a1, a2, ..., ak}开始
-
C语言八皇后问题解决方法示例【暴力法与回溯法】
本文实例讲述了C语言八皇后问题解决方法.分享给大家供大家参考,具体如下: 1.概述: 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上. 2.暴力法求解: #include<cstdio> #include<cmath> const int maxn=11; int count=0; //P为当前排列,hashTable记录整数x是否已经在
-
C++基于回溯法解决八皇后问题示例
本文实例讲述了C++基于回溯法解决八皇后问题的方法.分享给大家供大家参考,具体如下: 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法.这种方法适用于解一些组合数相当大的问题. 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯:否则,进入该子树,继续按深度优先策略搜索. 回溯法指导思想--走不通,就掉头.设计过程:确
-
Python基于回溯法子集树模板实现8皇后问题
本文实例讲述了Python基于回溯法子集树模板实现8皇后问题.分享给大家供大家参考,具体如下: 问题 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 分析 为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的皇后可以放置于第0.1.2.....7列,我们认为每一行的皇后有8种状态.那么,我们只要套用子集树模板,从第0行开始,自上而下,对每一行的皇后,遍历它的8个状态即可. 代码: ''' 8皇后问题 '''
-
PHP实现基于回溯法求解迷宫问题的方法详解
本文实例讲述了PHP实现基于回溯法求解迷宫问题的方法.分享给大家供大家参考,具体如下: 引言 最近在leetcode上看了些算法题,有些看着很简单的很常用的东西,竟然一下子想不出来怎么求解,比如说:实现sqrt函数,求数组的排列.如果高数学的不好,这些看似简单的问题,第一次碰到也会感觉很难求解,当然了,今天要说的是这样一个问题,求解迷宫的所有解,这个问题的求解用到了回溯法的思想,不了解这个思想的话,很多稍微复杂点的问题都很难解了. 问题描述 这个问题是在实在瞎逛的时候碰到的,具体哪里记不太清了.
-
Python基于回溯法子集树模板解决0-1背包问题实例
本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大? 分析 显然,放入背包的物品,是N个物品的所有子集的其中之一.N个物品中每一个物品,都有选择.不选择两种状态.因此,只需要对每一个物品的这两种状态进行遍历. 解是一个长度固定的N元0,1数组. 套用回溯法子集树模板,做起来不要太爽!!! 代码 '''0-
-
Python基于回溯法子集树模板解决取物搭配问题实例
本文实例讲述了Python基于回溯法子集树模板解决取物搭配问题.分享给大家供大家参考,具体如下: 问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. 头元素有['帽1', '帽2', '帽3', '帽4']共4种状态,身元素有['衣1', '衣2', '衣3', '衣4', '衣5']共5种状态,腿元素有['裤1', '裤2', '裤3']共3种状
-
Python基于回溯法子集树模板解决数字组合问题实例
本文实例讲述了Python基于回溯法子集树模板解决数字组合问题.分享给大家供大家参考,具体如下: 问题 找出从自然数1.2.3.....n中任取r个数的所有组合. 例如,n=5,r=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 分析 换个角度,r=3的所有组合,相当于元素个数为3的所有子集.因此,在遍历子集树的时候,对元素个数不为3的子树剪枝即可. 注意,这里不妨使用固定长度的解. 直接套用子集树模板.
随机推荐
- MyBatis Properties及别名定义实例详解
- 流行的软件测试工具介绍
- js实现局部页面打印预览原理及示例代码
- 键盘事件中keyCode、which和charCode 的兼容性测试
- Java中static作用详解
- Xen虚拟化基础篇第1/2页
- Openstack 创建项目和虚拟机详细介绍
- 探讨如何把session存入数据库
- thinkphp,onethink和thinkox中验证码不显示的解决方法分析
- 一次MySQL慢查询导致的故障
- Django的信号机制详解
- jquery实现简单的自动播放幻灯片效果
- IIS中给网站添加匿名访问用户图文教程
- 服务器安全问题汇总 让你的服务器更安全
- Android仿支付宝笑脸刷新加载动画的实现代码
- 详解Vue快速零配置的打包工具——parcel
- java实现按层遍历二叉树
- 微信小程序局部刷新触发整页刷新效果的实现代码
- CentOS平台快速搭建LAMP环境的方法
- Java中构造方法set/get和toString的使用详解