现在的位置: 首页 > 综合 > 正文

整数划分问题

2018年05月13日 ⁄ 综合 ⁄ 共 728字 ⁄ 字号 评论关闭

将一系列正整数表示成一系列正整数之和:

 n = n1 + n2 + .... + nk

   正整数n的一个这种表示方法称为正整数n的一个划分,正整数n的不同划分个数称为正整数n的划分数,记为p(n)

例如

  正整数6有下面6种不同的划分,分别记为:

   6 = 6

   6 = 5 + 1

   6 = 4+2, 4+1+1

   6 = 3+3, 3+2+1,3+1+1+1

   6 = 2+2+2,2+2+1+1, 2+1+1+1+1

   6 = 1+1+1+1+1+1

  其递归关系总结如下:

   1) q ( n,1) = 1 ( n >= 1)

    当最大加数不大于1时,任何正整数n只有一种划分: n = 1+1+1+...+1(n个)

   2) q ( n,m) = q( n,n ) m>=n

     最大加数实际上不能大于n,因此q(1,m) = 1

   3)    q(n,n) = 1+ q(n,n-1)

      正整数n的划分由n1=n和n1<= n-1的划分组成

   4) q(n,m) = q(n,m-1) + q(n-m,m) n > m > 1

     则算法

     

#include <iostream>
using namespace std;

int result( int n, int m)
{
    if ( (n<1)||(m<1) )
    {
        return 0;
    }
    if ( n == 1 || m == 1 )
    {
        return 1;
    }
    if ( n < m )
    {
        return result(n,n);
    }
    if ( n == m )
    {
        return result(n,m-1)+1;
    }
    return result(n,m-1) + result(n-m,m);
}

int main(int argc, char const *argv[])
{
    cout << result(6,6) << endl;
    return 0;

【上篇】
【下篇】

抱歉!评论已关闭.