爱嘉牛LA

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 分析可以看: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 ) ;
}
posted on 2012-10-10 21:17  爱嘉牛LA  阅读(204)  评论(0编辑  收藏  举报