简单的整数划分

来源:互联网 发布:毕向东java就业班视频 编辑:程序博客网 时间:2024/05/10 03:20

题目描述

将正整数n表示成一系列正整数之和,n=n1+n2++nk, 其中n1>=n2>=>=nk>=1 k>=1 

正整数n的这种表示称为正整数的划分。正整数的不同的划分个数称为正整数的划分数。


输入

标准的输入包含若干组测试数据。每组测试数据是一个整数N(0 < N <= 50)

输出

对于每组测试数据,输出N的划分数。

样例输入

5

样例输出

7

提示

5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1



该问题是求出n的所有划分个数,也就是f(n, n)。下面我们考虑求f(n,k)的递归方法


 

根据nk的关系,考虑以下几种情况: 

       (1)n=1时,不论k的值为多少(k>0),只有一种划分即{ 1 };

      

       (2) 当 k=1时,不论n的值为多少,只有一种划分即1  { 1, 1, 1, ..., 1 };

       

       (3) 当 n=k 时,根据划分中是否包含n,可以分为两种情况:

         (a).划分中包含n的情况,只有一个即{ n }

         (b).划分中不包含n的情况,这时划分中最大的数字也一定比小,即的所有( n - 1 ) 划分。因此 f(n, n) = 1 + f(n, n-1);

       

       (4)n < k 时,由于划分中不可能出现负数,因此就相当于 f(n, n);

       

       (5) n > k 时,根据划分中是否包含最大值 k,可以分为两种情况:

         (a).划分中包含 k 的情况,即 k, { x1, x2, ..., xi } },   其中 { x1, x2, ..., xi } 的和为n - k,可能再次出现 k,因此是(n - k)的k划分,因此这种划分个数为 f(n-k, k);

         (b).划分中不包含 k 的情况,则划分中所有值都比 k 小,即的 k - 1 ) 划分,个数为 f(n, k-1);

   因此 f(n, k) = f(n - k, k) + f(n, k - 1);

         

   综合以上情况,我们可以看出,上面的结论具有递归定义特征,其中(1)和(2)属于回归条件,(3)和(4)属于特殊情况,将会转换为情况(5)。而情况(5)为通用情况,属于递推的方法,其本质主要是通过减小k以达到回归条件,从而解决问题。其递推表达式如下:

               ( n=1 or k=1)           f(n,k)= 1

                   (n < k )            f(n,n)

               (n = k)           1+f(n,k-1)

               (n > k)           f(n-k,k)+f(n,k-1); 


代码示例



             





0 0