题目如下
任何正整数n都可以写成n=n1+n2+n3+……+nk;1<=n1,n2,n3,……nk<=n;这被称为整数n的划分。
例如
1.正整数3的划分如下:
3;
2+1;
1+1+1;
2.正整数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。
结题目标:
设计一个函数,求出n的划分个数。
首先在拿到题目的时候,我们就应该可以知道:n的m划分是个什么意思,也就是说划分必须满足:1<=n1,n2,n3,……nk<=m;这时我们就可以进行递归的分析了,对于所求未知数n的划分就是求f(n,n);
所以就会有下面的几种情况;
1.当n=1或m=1时,都只有一种划分;
2.当n=m时(不包含1),
划分中含有m时,有一种划分;
划分中不含m时,有f(n,m-1)中划分;
总而言之:f(n,m)=1+f(n,m-1);
4.当n>m时,
划分中含有m时,即划分的形式是{m,{x1, x2, ..., xi}},则{x1, x2, ..., xi}个数为f(n-m,m);
划分中不含m时,即划分中的数都比m小,则划分个数为f(n,m-1);
总而言之:f(n,m) = f(n-m,m)+f(n,m-1);
5.最后一个情况,当n<m时,f(n,m)= f(n,n);
所以总结下来就只有这几个总的情况;
f(n, m) = 1; ( n = 1 or m = 1 )
f(n, n); ( n < m )
1+ f(n, m - 1); ( n = m )
f(n - m, m) + f(n, m - 1); ( n > m )

其实在拿到这个题目的时候,大家就应该可以想到这个思维方式--分类讨论--这可能也是这份递归为什么能成为经典例题的一个原因吧。其实这题并不能很明显的找到缩小问题规模的入口,反而让你引入了一个过渡的变量,而且如果是按照之前一贯的思维,就可能陷入一个死循环,导致最终不能及时AC,所以,他也提醒我们在拿到题目的时候不要局限于一种两种考虑方式,可以多去尝试,大胆地用自己的想到的方法,可能下一个最快AC就来自你的小脑瓜。
jsj201 zhong
博客探讨了如何使用递归方法解决整数划分问题,给出了不同情况的递推公式,并强调了解题过程中分类讨论的重要性。通过实例展示了整数如3和6的划分,提醒读者在面对复杂问题时要勇于尝试不同的解题策略。
290

被折叠的 条评论
为什么被折叠?



