整数的划分问题
详见(http://www.darkswordzone.com/?p=749)
对于一个正整数n的划分,就是把n表示成一系列正整数的和,划分与次序无关。
如一个正整数5,可以划分为:
[5]
[4,1]
[3,2] [3,1,1]
[2,2,1] [2,1,1,1]
[1,1,1,1,1]
将一个正整数n划分,共有多少种划分方式?
上面的例子第一行,所有加数不超过5;
第二行,所有加数不超过4;
。。。。。。。
第五行,所有加数不超过1.
定义int fun(int n,int m)表示正整数n,所有加数不超过m的划分数目。
那么
1,n==1或m==1 时共有1种划分方式。
2,n==m时 fun(n,m)=fun(n,m-1)+1 。
3,n>m时, 我们发现只要将fun(n,m-1)加上包含加数m的划分数就等于div(n,m)。即:fun(n,m) = fun(n,m-1) + 包含加数m的划分数。
包含加数m的划分数可以转化为:fun(n-m,m)。所以3可以表示为:
fun(n,m) = fun(n,m-1) + fun(n-m,m)
4、n < m 等同于2.
代码如下:
View Code
1 //求正整数n的划分数 2 #include<iostream> 3 using namespace std; 4 int fun(int n,int m){ 5 if(n==1 || m==1) 6 return 1; 7 else if(n==m) 8 return fun(n,m-1)+1; 9 else if(m>n) 10 return fun(n,n); 11 else 12 return fun(n,m-1)+fun(n-m,m); 13 } 14 int main(){ 15 int n; 16 while(cin>>n){ 17 cout<<fun(n,n)<<endl; 18 } 19 return 0; 20 }
keep moving...