递归---整数划分问题
2017-12-19 16:50
239 查看
将正整数n表示成一系列正整数之和,n=n1+n2+n3+......nk(其中,n1>=n2>=......nk>=1,k>=1),正整数n的这种表示称为正整数n的划分。正整数n的不同划分个数称为正整数n的划分数,记作p(n)。例如:正整数6有11总不同的划分
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;
记q(n,m)为正整数n的所有不同划分中,最大加数n1不大于m的划分个数。可以建立如下递推关系:
前面三个递推式比较好理解,关键是第四个递推式。当n>m>1时,n的划分由两部分组成。以整数q(6,3)为例,q(n,m-1)内容是第5排和第6排内容,不大于2的6的划分;q(n-m,m)内容是第4排,不大于3的(6-3=3)的划分。
#include <iostream>
using namespace std;
int q(int n,int m)
{
if(n<1||m<1) return 0;
if(n==1||m==1) return 1;
if(n<m) return q(n,n);
if(n==m) return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
int main()
{
cout<<q(6,6);
return 0;
}
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;
记q(n,m)为正整数n的所有不同划分中,最大加数n1不大于m的划分个数。可以建立如下递推关系:
前面三个递推式比较好理解,关键是第四个递推式。当n>m>1时,n的划分由两部分组成。以整数q(6,3)为例,q(n,m-1)内容是第5排和第6排内容,不大于2的6的划分;q(n-m,m)内容是第4排,不大于3的(6-3=3)的划分。
#include <iostream>
using namespace std;
int q(int n,int m)
{
if(n<1||m<1) return 0;
if(n==1||m==1) return 1;
if(n<m) return q(n,n);
if(n==m) return q(n,m-1)+1;
return q(n,m-1)+q(n-m,m);
}
int main()
{
cout<<q(6,6);
return 0;
}
相关文章推荐
- 2.1递归概念 - 对排序问题、整数划分问题、汉诺塔问题的理解
- 【递归】排列问题,整数划分问题,Hanoi
- 递归 放苹果问题和整数划分问题
- 整数划分问题(递归策略)
- NYOJ 279 队花的烦恼二和NYOJ 176 整数划分(二)【dp问题或递归】
- 整数划分问题之递归法
- 递归 放苹果问题和整数划分问题
- 数据结构:整数划分问题 + DFS递归解决
- 递归 放苹果问题和整数划分问题
- 整数划分问题(递归)
- 正整数划分问题(递归优化)
- 递归求解整数划分问题 分类: 算法 2014-09-25 21:37 158人阅读 评论(0) 收藏
- 跳台阶问题|斐波那契递归的复杂度问题|整数划分问题
- 递归 放苹果问题和整数划分问题
- 递归--整数划分问题
- 算法(1)整数划分问题之递归解决
- 递归--整数划分问题
- 递归求解整数划分问题
- 递归——整数划分问题
- 递归 放苹果问题和整数划分问题