分析可以看:http://www.cnblogs.com/hoodlum1980/archive/2008/10/11/1308493.html
View Code
#include<iostream.h> int p( int n , int m ) ; int main() { int n; int Num = 0 ; /*划分数*/ cout<<"n:"; cin>>n; Num = p(n,n); cout<<Num<<endl; return 0; } /* 函数: intPart 参数: int n , int m( 将n表示为最大加数不大于m的划分 ) 返回: int */ int p( int n , int m ) { /*n=1时只能有一种表示,即1=1*/ /*m=1时也只有一种表示,n = 1 + 1 + ……+1*/ if( ( n == 1 )||( m == 1 ) ) return 1 ; /*当m>n时,由于m不能大于n,否则就会有负数出现了*/ /*因此只能表示成最大加数不大于n的划分*/ if( n < m ) return p( n , n ) ; /*当m==n时,首先可以有一种表示: n=m*/ /*其余的就表示成最大加数不大于m-1的划分*/ if( n == m ) return p( n , m-1 ) + 1 ; /*一个数的最大加数为m的划分可以表示为两部分: 1.最大加数为m的划分,表示为intPart( n-m,m ) 2.最大加数不大于m-1的划分,表示为intPart(n, m-1 )*/ return p( n , m-1 ) + p( n - m , m ) ; }