解决排列组合问题的通用算法

原创 2007年10月10日 17:26:00
很多网友发贴询问诸如:八皇后问题、彩票问题(从m中数中选择n(m>=n)的组合)等,其实这都可归结为排列组合的问题。解决这类问题,用for循环嵌套是不现实的(只能对指定的m、n编程,而且程序看上去异常繁琐),较好的方法是回朔法。下面给出这类问题的一般算法的c/c++描述:

int combine(int a[],int sub){
//a[1..?]表示候选集,sub表示一个排列(组合)的元素个数
{
   int total=sizeof(a);
   int order[sub+1];
   int count=0;//符合条件的排列(组合)的个数
   order[0]=-1;
   for(int i=1;i<=sub;i++)
      order[i]=i;
   int k=sub;
   bool flag=true;
   while(order[0]!=-1){
      if(flag){
         for(i=1;i<=sub;i++)//输出符合要求的组合
            printf("%d ",a[order[i]]);
         printf("/n");
         count++;
         flag=false;
      }
      order[k]++;
      if(order[k]==total+1){
         order[k--]=0;
         continue;
      }   
   ...
      //在此加入order[k]的限制条件
      //如果条件满足,则往下执行
      //否则continue;
      if(k<sub){
         order[++k]=order[k-1];
         continue;
      }
      if(k==sub)
         flag=true;
   }
   return count;
} 本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( ProgramFan.Com )  

排列组合问题的通用算法

排列组合问题的通用算法     尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手。由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅...
  • nick870208
  • nick870208
  • 2013年05月24日 17:00
  • 413

回溯法解决排列组合问题

package 算法和数据结构; /** * Filename : Backtracking.java * Author : zhihao_tian@126.com * Creation time :...
  • sdu_bupt
  • sdu_bupt
  • 2017年05月09日 23:18
  • 331

dfs 递归思想 解决排列组合的一些基础问题

对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务。递归是一种常用算法,它是搜索的另一种实现方式。如果在算法设计中采用一个函数或过程直接或...
  • liuyanfeier
  • liuyanfeier
  • 2015年08月12日 20:31
  • 417

排列组合和回溯算法-面试题

排列组合和回溯算法的面试题
  • sunxianghuang
  • sunxianghuang
  • 2016年07月13日 15:02
  • 1892

排列组合之错排问题总结

目测最近要刷刷关于排列组合的题目。。。 所以现在将遇到的那些熟悉却已经忘记的问题都总结一下。。 第一发: 错排以及错排公式 其实错排问题对于程序算法而言,就是递归问题。因为错排的理解其实...
  • hu1020935219
  • hu1020935219
  • 2013年09月22日 14:48
  • 1703

C++实现排列组合

很多地方都遇过排列组合,比如计算问题的规模,数据的大小,占用磁盘空间多少等。 原理部分借鉴网上一篇文章,道理已经说的很清楚就不重复了。 (1) 全排列: 全排列表示把集合中元素的所有按照一定的顺...
  • jfcat
  • jfcat
  • 2013年04月10日 23:18
  • 13325

蓝桥杯——排列组合问题

题目: 有一次,老师出的题目是:36 x 495 = ? 他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案竟然是对的!! 因为 36 * 495 = 396 * ...
  • zzp961224
  • zzp961224
  • 2017年03月12日 15:19
  • 218

c语言实现排列组合算法问题

排列组合是算法常用的基本工具,如何在c语言中实现排列组合呢?思路如下: 首先看递归实现,由于递归将问题逐级分解,因此相对比较容易理解,但是需要消耗大量的栈空间,如果线程栈空间不够,那么就运行不下去了...
  • lanmo555
  • lanmo555
  • 2014年03月28日 16:29
  • 3688

DFS之枚举排列组合

枚举可重复排列的模板 #include using namespace std; int n,m,ans[15]; int a[15];//待排列的数存储在此 bool vis[15]; void ...
  • u013615904
  • u013615904
  • 2015年01月29日 19:41
  • 1716

Java实现排列组合算法

用Java实现排列算法: package Sort; import java.util.ArrayList; import java.util.List; public class Arrange...
  • YHYR_YCY
  • YHYR_YCY
  • 2016年09月13日 09:51
  • 12256
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决排列组合问题的通用算法
举报原因:
原因补充:

(最多只允许输入30个字)