`
zxxapple
  • 浏览: 78204 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

数列的排列与组合问题

阅读更多

关于数列的全排列已经另外一篇文章中提到过了,

 

下面来介绍下数列的组合问题:

 

例如;序列12345  如果输入m=3,原序列的长度n=5

得到的组合数组是:123 124 125 134 135 145 234 235 245 345

如上得到所有的位数为2的组合方式,从上面的数我们也可以用序号表示:

a[0],a[1],a[2],a[3],a[4],a[5]

 

得到的组合数a[0],a[1],a[2]可用下标012表示

 

那么组合数就可以用原来数列的的下标表示即可:

 

从一开始,得到的组合数列,所有组合数的下标是递增 的,最后一个组合序列的最后一位的下标即为n-1;

 

我们定义一个数组p[x]=y  取到的第x个元素是数组a中的第y个元素 x代表的是组合序列的中的元素的索引  y代表的是数组a中的元素索引。

 

#include<stdio.h>
#include <stdlib.h>

bool zuhe(char a[],int n,int m)
{
   int index,i,*p;
   p=(int*)malloc(sizeof(int)*m);
    if(p==NULL)
    {
        return false;
    }
    index=0;//index代表的是组合串中的元素的索引,即代表组合数中的第几个数
    p[index]=0;//取第一个元素,从一个元素开始
    

    while(true)
   {
          /*组合数中的某一个位置的元素到达原数组最后一个                              原素了,比如15_  或者125  其中的5 达到数组的最后一个元素*/
         if(p[index]>=n)
        {
              if(index==0)
              {
                  //此时组合的第一个数也达到了数组中的最后一个数。退出循环
                  break;
               }
               index--;     //此时的组合数列的index位置上的数已经达到数组最后一个数,所以回到前一个位置,将其加1 ps. 135--->14_
               p[index]++; 
        }
        else if(index==m-1)//此时已经组合到最后一个位置,可以输出
        {
             for(i=0;i<m;i++)
            {
                printf("%c",a[p[i]]);
            }
            printf("\n");
            //此时的index已经达到组合数的最后一个位置,exp 134->135
            p[index]++;
        }
        else //此时index还未达到最后的位置exp 13_--->134
        {
              index++;
              p[index]=p[index-1]+1;
          }
    }
}

 但是上述办法还是不能解决原数列出现重复元素的问题:还得需要后期的去重处理。

 

 

如果将这些求一个数列的排列组合的方法结合起来,就可以解决如下的一个问题

 

 

 

问题:

当给以出一个数列,求出其所有的组合函数,比如abc  输出:a,b,c,ad,ac,bc,abc

 

只需在上面的基础之上加一个for循环即可:

 

main()
{
	char a[]="12345";
	for(int i=1;i<=5;i++)
	{
		printf("i:%d:\n",i);
		zuhe(a,5,i);
	}
}
分享到:
评论

相关推荐

    递归求解几类排列组合问题

    递归求解几类排列组合问题,求组合数列的情况

    高2013级高三周考试题-排列组合与数列.docx

    高2013级高三周考试题-排列组合与数列.docx

    组合数学及其算法

    第二章 排列与组合 2.1 两个基本计数原理 2.2 无重集的排列与组合 2.3 重集的排列与组合 2.4 排列生成算法 2.4.1 序数法 2.4.2 字典序法 2.4.3 轮转法 2.5 组合生成算法 .2.6 应用举例 习 题...

    Delphi 演示0~N位数的任意组合.rar

    Delphi 数列的排列组合一例,演示0~N位数的任意组合,组合的数字在0~5之间,需要输入1~6整数,排列结果会显示在文本框组件中。要点代码如下:  ssList := TStringList.Create;  try  if (nBase ) then  begin  ...

    C#递归算法:0~N位数的排列组合

    摘要:C#源码,随书源码,递归算法,排列组合 C#递归算法:0~N位数的排列组合,组合的数字在0~5之间,输入需要组合的位数,点击“计算”按钮,程序会列出所有符合条件的数列组合。一个学习C#递归算法的好范例。

    组合数学(原书第4版)(美)Richard A. Brualdi

    本书侧重于组合数学的概念和思想,包括鸽巢原理、计数技术、排列组合、Polya计数法、二项式系数、容斥原理、生成函数和递推关系以及组合结构(匹配、实验设计、图)等,深入浅出地表达了作者对该领域全面和深刻的理解...

    数学、统计学系列组合数学 [陈景润 编] 2012年版

    第二章 排列与组合 §1 排列 §2 组合 §3 (n),和(n/y)的取值范围的扩充 §4 二项式定理和它的应用 §5 多项式定理 习题 第三章 抽屉原则 §1 抽屉原则的最简形式 §2 抽屉原则的一般形式 §3 关于Ramsey定理 ...

    问题描述:求从1~n的正整数中取出k(k<=n)个不重复整数的所有组合.pdf

    分析:求解k个数的不同...素是不重复的,可以约定其递增排列,因为数组中的元素是递增排列的: 所以a[k-1]即组合中的最后一个数,只能为k~n 令i=a[k-1] 则 i&gt;=k && i 完整代码请参考我的博客文章,这里只是核心部分

    整数分拆以及等差数列多重约束条件下全排列的生成法

    整数分拆以及等差数列多重约束条件下全排列的生成法,杜瑞卿,刘广亮,为了能够实现整数分拆有序和无序的全部排列和组合,以及任意等差数列的全排列生成及其在多重约束条件下的全排列生成,详细论证了

    leetcode爬楼梯排列组合解法-algorithm_practice:对数据结构、算法相关的编程实践(DataStructureandAl

    leetcode爬楼梯排列组合解法 Data Structure and Algorithmic Practice 【任务1 - 数组与链表】 1、数组 实现一个支持动态扩容的数组 实现一个大小固定的有序数组,支持动态增删改操作 实现两个有序数组合并为一个...

    我探索全错位排列的过程

    对全错位排列的探索欧拉说过全错位排列是组合数论中的一个妙题,下面就介绍以是怎么独立发现(那时我连他 的名字都不知道,管他叫错位数列)全错位排列,又是怎样研究解决我想要得到的结果;

    C++递归数组排列及查询

    Please use recursion(递归)to get fibonacci numbers(一种整数数列). The user will specify(指定,详细说明) how many of the numbers he or she wants to print. You can use the main function to print ...

    组合数学2

    1.排列 2.组合 3.多重集排列 4.多重集组合 5.二项式定理及其扩展 6.常用组合数公式 1.斐波那契数列 2.卡特兰数 3.贝尔数 4.第一类斯特林数

    200个C程序.rar

    030 字符排列 031 判断字符串是否回文 032 通讯录的输入输出 033 扑克牌的结构表示 034 用“结构”统计学生成绩 035 报数游戏 036 模拟社会关系 037 统计文件的字符数 038 同时显示两个文件的内容 039 简单...

    组合数学中的第二类斯特林数“同一列”的C++代码实现

    第二类斯特林数是组合数学中的一类整数数列,用于表示将 n 个物体划分成 k 个非空循环排列的方法数。这些数以数学家詹姆斯·斯特林 (James Stirling) 的名字命名,是集合划分的一种。第二类斯特林数通常用 S(n, k) ...

    ACM函数整理_ACM模板.pdf

    目录 一、数学问题 1.精度计算——大数阶乘...12.求排列组合数 13.求某一天星期几 14.卡特兰(Catalan) 数列原理 15.杨辉三角 16.全排列 17.匈牙利算法----最大匹配问题 18.最佳匹配KM 算法二、字符串处理 1.字符串替换

    预科数学基础教程 [许涓 主编] 2012年版

    预科数学基础教程 作者:许涓 主编 出版时间:2012年版 内容简介  《预科数学基础教程》具备以下特点:(一)汉字认读与数学语言的结合对于汉语...7.2 排列与组合 7.2.1 排列数、组合数 7.2.2 二项式 附录 几何图形

    算法竞赛中的第一类斯特林数“同一行”的C++代码实现

    该代码可以在O(n log n)的时间内求解“同一行”的第一类斯特林数。 第一类斯特林数是组合数学中的一类整数数列,用于表示将n个...第一类斯特林数在组合数学、概率论、统计学等领域有广泛的应用,例如在研究排列组合问

    C-Program-examples.rar_2维码 C语言_c 卡牌游戏_字串核对_背包问题_蒙塔卡罗法

    排列组合 格雷码(Gray Code) 产生可能的集合 m元素集合的n个元素子集 数字拆解 排序 得分排行 选择、插入、气泡排序 Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良...

    经典算法大全,常用的算法都在这里

    排列组合 格雷码(Gray Code) 产生可能的集合 m元素集合的n个元素子集 数字拆解 排序 得分排行 选择、插入、气泡排序 Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - ...

Global site tag (gtag.js) - Google Analytics