整数的划分问题

详见(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...
原文地址:https://www.cnblogs.com/xxx0624/p/2602037.html