美文网首页算法笔记
递归--整数划分问题

递归--整数划分问题

作者: 郎小凯 | 来源:发表于2017-09-09 16:46 被阅读0次

        前置文章:递归算法:www.jianshu.com/p/703069f3ba3f .

        在说到递归算法的时候,逃不开的一个经典问题是整数划分问题。整数划分,试讲一个正整数n表示成多个正整数的和:n=m1+m2+……+mk( mk为正整数,且 1 <= mk <=n ),那么{ m1,m2……mk } 就是n的一个划分。

        那么整数划分是什么意思呢?打个比方,我家里现在还是有那一片苹果林,我这去年就不养兔子了,吃穷了,养不起。这样今年结的苹果我可以拿来送人或者是拿去卖了。正好最近我家里要来一些我的老同学,我现在不知道来多少人,只知道最少来两个,最多四个人,恰巧我这苹果林结的苹果有四斤熟了,我就打算送给他们。但是我这不确定来多少人,我就要提前规划好我这四斤苹果怎么送:

            我这里来俩人,这俩人跟我关系不一样,一个关系好一个关系差,那我就给那关系好的三斤,剩下一斤给另一个:3+1;来这俩人跟我关系一样呢,那我就一人两斤:2+2;

            我这里来三人,我就根据关系分了,一人两斤,剩下俩人一人一斤:2+1+1;

            要是来四人,正好一人一斤,不偏不倚:1+1+1+1。

        我给这四斤苹果做的这个划分,就是一个整数划分。在整数划分里面,一个整数的划分种最大家数s不超过m,即s=max(m1,m2……,mk)<= m,这个划分就叫做n的一个m划分,记做 f (n,m)。划分问题现在就转换成了求n的划分个数f (n,n)。

        建立f (n,m)的划分关系:

            (1) f(1,m) = 1,m>=1;  n =1,划分只有一种,就是1.

            (2) f(n,1) = 1,n>=1; m =1,划分只有一种,n个1.

            (3) f(n,m) = f(n,n);最大加数不能超过n.

            (4) f(n,n) = f(n,n-1); n的划分是由s=n划分和s<=n-1的划分构成。也就是1+3 = 1+1+2

            (5) f(n,m) = f(n,m-1) + f(n-m,m) n>m>1;也就是最大加数s不大于m的划分,是由s=m的划分和s<=m-1的划分组成。

        这样,就能做出f(n,m) 的递归公式:

                             1                                   n=1,m=1

            f(n,m) =    f(n,n)                            n<m

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

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

        然后做出正整数n的划分:

int split ( int n, int m ) {

        if ( n==1 || m==1 ) return 1;

        else if (n < m ) return split(n,n);

        else if (n==m) return split(n,n-1)+1 ;

        else return split(n,m-1) + split(n-m,m);

}

        这个样子,无论是整数划分问题还是我的苹果划分问题都解决了,那我接下来就只需要等着我那些老同学来,然后分四斤苹果了,至于苹果林结的剩下的40斤苹果,我去问问我家喵主子吃不吃。

 

相关文章

  • 递归--整数划分问题

    前置文章:递归算法:www.jianshu.com/p/703069f3ba3f . 在说到递归算法的时候,逃...

  • 整数划分问题

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

  • 动态规划——【转】划分数问题

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

  • 整数划分问题

    什么是整数划分?将正整数n表示成一系列正整数的和。例如5的划分:5(1) 5;(2) 4+1;(3) 3+2 3...

  • 整数划分问题

    将一个整数划分为多个整数想加的形式,并计算划分方法。例:6的划分:6=5+16=4+26=4+1+16=3+36=...

  • 算法竞赛入门经典(第二版)-分治法_8.1.3

    分治法的思路不难理解:1,划分问题:把问题的实例划分成子问题2,递归求解:递归解决子问题3,合并问题:合并子问题的...

  • 【算法基础】整数划分问题

    【问题】将整数n表示为一系列正整数的和。 n = n1 + n2 + ...+ nk (n1 >= n2>=......

  • C语言-递归实现整数n逆序输出

    问题描述:递归实现整数n逆序输出 源代码: 运行结果: 程序参数: 输出大小: 149.3837890625 Ki...

  • 分治法

    整数划分 所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi; (其中mi为正整数,并且1...

  • Fork/Join框架与ForkJoinPool

    1. Fork/Join框架 fork操作的作用是把一个大的问题划分成若干个较小的问题。在这个划分过程一般是递归进...

网友评论

    本文标题:递归--整数划分问题

    本文链接:https://www.haomeiwen.com/subject/ncnijxtx.html