《大神养成记》

闭关,修炼,打坐。疯狂学习学习,疯狂打Codeforces

整数划分定义与解析(递归)

1.背景:整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。
2.定义:所谓整数划分,是指把一个正整数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)的方法;
3.递归法:
根据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

—————上半部分转载自http://blog.csdn.net/niushuai666/article/details/6600977

4.解析:
当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,1,1}
总共11种划分方法;
程序第一步调用F(6,6):这个时候将整数的划分数目为1(即{6})+F(6,5);//第一步作用将{6}集合与6的5划分分开
程序第二步调用F(6,5):这个时候此部分的划分数目为F(1,5)(即{5,1})+F(6,4);//第二步作用将{5,1}集合与6的4划分分开
程序第三步调用F(6,4):这个时候此部分的划分数目为F(2,2)(即{4,2}{4,1,1})+F(6,3);//第三步将{4,2}{4,1,1}集合与6的3划分分开

程序第六步调用F(6,1):满足条件if(n==1||m==1)直接return 1;
///////////////////////////////////////////////////////
//
//注:由此看出F(n-m, m)与F(n,m-1)两个函数的作用
// F(n,m-1)的作用是逐步递归,使其逐步接近终点
// F(n-m, m)的作用是对6的5划分中的第5行、6的4划分中的第4行
// 等进行排序
// 例:6的4划分的第4行是{4,2}{4,1,1},即F(2,2)是
// {2}{1,1}
// 于是便通过一个递归函数从复杂至简单,一个每行排序的函数,
// 从6->5->4->3->2->1一直排序得出最终的结论,11种
//
///////////////////////////////////////////////////////

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SeansZou/article/details/46813593
文章标签: 递归 解析
个人分类: ACM.常识
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

整数划分定义与解析(递归)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭