整数划分问题
2020-04-05 12:15
85 查看
整数划分问题
题目描述
将正整数n表示为一系列正整数之和,
n=n1+n2+n3+n4+......+nk (其中,n1>=n2>=n3>=n4........>=nk>0,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;
这是一道比较绕的递归问题,绕就绕在数学上,有点不好理解。
引入变量m表示最大加数,由上图分析可得
q( n, n ) = 1, 当 n ==1;
q( n, n ) = 1, 当m == 1;
q( n, n ) = q( n,n ) , 当n < m;
q( n, n ) = q( n, m-1) +1 , 当n == m;
q( n, n ) = q( n - m, m ) + q( n , m -1) , 当n > m;
也就是说,当m=n时,递归1+q( n, m-1) 比如m=n=6最大加数为6,则递归1+q(6,5),1既是6这种情况然后加上最大加数为5的所有情况,而最大加数为5仍需递归。
这时候n=6,m=5 又分为两种,q(6,4)即最大加数为4的所有情况和q(1,5)
如此再对q(6,4)递归
而当m或n等于1时只有1种情况也就是达到边界
递归结束后既出答案
#include<bits/stdc++.h> using namespace std; int q(int n,int m) { if(n==1||m==1){ return 1; }else if(n>m){ return q(n-m,m)+q(n,m-1); }else if(n<m){ return q(n,n); }else{ return 1+q(n,n-1); } } int main() { double start,stop,dur; start=clock(); int a=6; cout<<q(6,6); stop=clock(); dur=stop-start; cout<<"\n用时:"<<dur<<"毫秒\n"; return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- POJ 1664 整数划分问题
- 整数划分问题(递归法)
- 整数划分问题及其算法
- (dp)openjudge 复杂的整数划分问题
- dp-整数划分问题(理论分析)
- 整数划分问题
- NYOJ 651 Cut the rope(DP, 经典的整数划分问题)
- POJ 4117 简单的整数划分问题
- 递归分治算法之整数划分问题(Java版本)
- Openjudge7219 复杂的整数划分问题(dp)
- 7215:简单的整数划分问题
- 整数划分问题
- C++ 求解一整数划分问题
- 整数划分问题
- 递归 放苹果问题和整数划分问题
- 0002算法笔记——【递归】排列问题,整数划分问题,Hanoi问题
- 整数划分问题
- 2.1递归概念 - 对排序问题、整数划分问题、汉诺塔问题的理解
- 整数划分问题
- 整数划分问题---动态规划、递归