本文章由本人独自编写,如果有任何错误的地方,欢迎指正,谢谢
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1028
整数划分问题,如果设 p(n) 为整数 n 的划分数,则难以找到递归关系,因此可以考虑增加一个自变量:将 ”最大加数 k 不大于 m “ 的划分个数
记为 q(n,m) 。可以建立 q(n,m) 的如下递归关系:
正整数 n 的划分数 p(n) = q(n,n)
(1)q(n,1) = 1 ,n>=1
当最大加数 k 不大于1时,任何正整数 n 只有一种划分形式,即 n = 1+1+.......+1
(2)q(n,m) = q(n,n) ,m>=n
最大加数 k 实际上不大于 n 。因此,q(1,m) = 1.
(3)q(n,n) = 1 + q(n,n-1)
正整数 n 的划分由 k = n 的划分和 k<=n-1 的划分组成
(4)q(n,m) = q(n,m-1) + q(n-m,m) ,n >m>1
正整数 n 的最大加数 k 不大于 m 的划分由 k=m 的划分和 k <=n-1 的划分组成
#include<iostream>
using namespace std;
int IntHuaFen(int n,int m)
{
if(n>=1&&m==1)
return 1;
else if(n<m)
return IntHuaFen(n,n);
else if(n==m)
return 1+IntHuaFen(n,n-1);
else if(n>m&&m>1)
return IntHuaFen(n,m-1)+IntHuaFen(n-m,m);
}
int main()
{
int n,ans;
while(cin>>n)
{
ans=IntHuaFen(n,n);
cout<<ans<<endl;
}
return 0;
}