递归--整数划分问题

        前置文章:递归算法: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斤苹果,我去问问我家喵主子吃不吃。

 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 8,083评论 0 6
  • 1、土豆切丝,沸水煮一下,别太久。 2、干辣椒、蒜、下油炒香。 3、肉调好味,下油炒,调味。 4、倒入土豆丝,醋、...
    尹微优阅读 1,105评论 0 0
  • - 12月我计划每2日完成1幅图,但未达成 1.3日开始每日一图,达成了 这是几乎同样的一个计划,后面的计划甚至是...
    会儿儿儿儿儿阅读 1,417评论 0 0