整数划分问题的递归算法-c语言

  

整数划分问题的递归算法-c语言

转载 2014年01月03日 18:46:58

整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:

       n=m1+m2+...+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,...,mi}为n的一个划分。

       如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);

       例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};

       注意4=1+3 和 4=3+1被认为是同一个划分。

       该问题是求出n的所有划分个数,即f(n, n)。下面我们考虑求f(n,m)的方法;

 

        ---------------------------------------------------------------------

                                           (一)递归法

        ---------------------------------------------------------------------

       根据n和m的关系,考虑以下几种情况: 

       (1)当n=1时,不论m的值为多少(m>0),只有一种划分即{1};

        (2)  当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,...,1};

        (3)  当n=m时,根据划分中是否包含n,可以分为两种情况:

              (a). 划分中包含n的情况,只有一个即{n};

              (b). 划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。

              因此 f(n,n) =1 + f(n,n-1);

        (4) 当n

        (5) 但n>m时,根据划分中是否包含最大值m,可以分为两种情况:

               (a). 划分中包含m的情况,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和为n-m,可能再次出现m,因此是(n-m)的m划分,因此这种划分

                     个数为f(n-m, m);

               (b). 划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1);

              因此 f(n, m) = f(n-m, m)+f(n,m-1);

 

         综合以上情况,我们可以看出,上面的结论具有递归定义特征,其中(1)和(2)属于回归条件,(3)和(4)属于特殊情况,将会转换为情况(5)。而情况(5)为通用情况,属于递推的方法,其本质主要是通过减小m以达到回归条件,从而解决问题。其递推表达式如下:

         f(n, m)=       1;                                (n=1 or m=1)

                            f(n, n);                         (n

                            1+ f(n, m-1);                (n=m)

                            f(n-m,m)+f(n,m-1);       (n>m)

 

  1. linux@ubuntu:~/workdir/ACM-ICPC$ cat IntDivide.c  
  2. #include   
  3.   
  4. int IntDivide(int n, int m)  
  5. {  
  6.         if((n<1)||(m<1))  
  7.                 return 0;  
  8.         if((n==1)||(m==1))  
  9.                 return 1;  
  10.         if(n
  11.                 return IntDivide(n,n);  
  12.         if(n==m)  
  13.                 return IntDivide(n,n-1)+1;  
  14.         return IntDivide(n-m,m)+IntDivide(n,m-1);  
  15. }  
  16.   
  17. int main()  
  18. {  
  19.         int n=0,m=0;  
  20.         int result=0;  
  21.   
  22.         scanf("%d %d",&n,&m);  
  23.   
  24.         result = IntDivide(n,m);  
  25.   
  26.         printf("%d\n",result);  
  27.   
  28.         return 0;  
  29. }  

整数划分问题(C语言求解)

  • oopos
  • oopos
  • 2007年10月16日 09:09
  • 1535
 /**//*描述 Description      将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5; 1,5,1; 5...

整数划分问题的递归算法-c语言

  • xiezhongtian
  • xiezhongtian
  • 2014年01月03日 18:46
  • 1976
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:        n=m1+m2+...+mi; (其中mi为正...

【分享】成为编程高手的路上,我避开了哪些坑儿?!

同是程序员,有的前端8k,有的前端月薪20k,背后的原因是什么,我经历的经验分享给你们....

整数划分如,对于正整数n=6,可以分划为:6 5+1

整数划分 如,对于正整数n=6,可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+...
  • chzayi
  • chzayi
  • 2015年03月28日 15:21
  • 1613

openjudge 简单的整数划分问题

  • kucece
  • kucece
  • 2015年07月04日 23:27
  • 1818
T2:简单的整数划分问题 查看提交统计提问 总时间限制: 100ms 内存限制: 65536kB 描述 将正整数n 表示成一系列正整数之和,n=n1+n2+…+nk, 其中n1>=n2>=...

背包问题的递归算法,C语言实现

  • 2010年05月09日 21:55
  • 24KB
  • 下载

整数划分问题 ----- 递归算法

  • u012965373
  • u012965373
  • 2015年01月06日 20:44
  • 513
对于整数划分我想看到这篇博客的人一定不陌生。 4 = 1 + 1 + 1 +1; 4 = 1 + 3; 4 = 1 + 1 + 2; 4 = 4; 4 = 2 + 2;共五种分法。 ...

百炼-1321-棋盘问题-C语言-递归算法

  • OrdinaryCrazy
  • OrdinaryCrazy
  • 2017年08月09日 22:47
  • 223
描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆...

递归算法——Hanoi(汉诺)问题(Java实现&C语言实现)

某寺庙前有三根柱子A、B、C,开始时A柱上有n个盘子,盘子大小不等,大的在下、小的在上(下图所示)。有一老和尚想把这n个盘子从A柱移到C柱上,但每次只允许移动一个盘子,且在移动过程序中每根柱子上都始终...
  • zimou5581
  • zimou5581
  • 2016年10月13日 19:52
  • 1132

百炼-2815-城堡问题-C语言-递归算法

  • OrdinaryCrazy
  • OrdinaryCrazy
  • 2017年08月07日 19:54
  • 122
首先是一种比较直观的解法,虽然原理没问题,但实现的就不是很有技巧了。 /************************************************* **文件名:百炼-2815 ...

[黑马程序员]04[c语言]递归算法的妙用, 捕鱼量算法问题

前言: 当我们学习到函数的时候,主要涉及到的是函数的基本语法以及函数的封装,最后在听到递推关系式时,提到了递推函数 的概念. 提及的是,递推函数虽然在解决部分递推关系时比较方便,有一定的好处,...
  • astina2011
  • astina2011
  • 2015年04月15日 01:10
  • 659

C语言全排列的递归算法

  • 2007年01月12日 14:45
  • 426B
  • 下载

递归算法实现组合(c语言实现,平台:Automation Studio@AR system)

  • 2012年05月04日 11:31
  • 916KB
  • 下载

数据结构 二叉树的递归算法、前序、中序、后序遍历(c语言实现)

实验目的 1、掌握二叉树的表示与实现。 2、掌握二叉树的定义、创建、遍历等基本操作的实现。 3、熟悉求二叉树深度等递归算法的设计与实现。 实验内容 问题描述:已知二叉树t,分别采用顺序存储结...
  • catkint
  • catkint
  • 2015年12月18日 23:08
  • 5408

汉诺塔的递归算法 C语言

  • 2013年10月18日 16:14
  • 464B
  • 下载

c语言汉诺塔的递归算法

  • 2012年12月25日 14:57
  • 206KB
  • 下载

二叉树的建立与输出以及其他一些相关操作(递归算法实现) C语言

/********************************************************/ #include #include #include /******...
  • zhuyi2654715
  • zhuyi2654715
  • 2011年09月13日 23:50
  • 7069

二叉树的遍历(c语言非递归算法)

  • huangbo201102
  • huangbo201102
  • 2014年02月07日 20:12
  • 678
二叉树的遍历有三种方式,如下: (1)前序遍历(DLR),首先访问根结点,然后遍历左子树,最后遍历右子树。简记根-左-右。 (2)中序遍历(LDR),首先遍历左子树,然后访问根结点,最后遍...

排列和组合的非递归算法的C语言实现

  • gaojinshan
  • gaojinshan
  • 2012年08月08日 13:05
  • 3276
2008-11-28 09:56 #include #include //从n个元素的数组a中,取m个元素的组合 bool zuhe(char a[],int n,int m) ...

C语言实现单链表翻转的递归算法

  • Csdn_zc
  • Csdn_zc
  • 2011年11月28日 15:46
  • 4043
/* Code by : EricYou     http://www.cnblogs.com/yxin1322 Date: 2006.1.14   */ #include ...

约瑟夫环的C语言和86/88汇编非递归算法

  • jia12216
  • jia12216
  • 2015年06月23日 19:50
  • 1145
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...

你可能感兴趣的:(算法)