整数划分问题

今天刚好遇到一道整数分解题目,把自己以前的做过的题翻出来看了下,写了个小总结。

首先是最典型的整数分解,例如给定n个苹果,把苹果放到k个盘子里,允许有的盘子为空(poj1664),不妨设 f(n , k ) (边缘条件为当 n = 0 时,返回1,当 k = 1 时,返回1)表示结果,分析一下可以知道有两中放的方法,一种是有空盘,一种是没空盘,没空盘的情况可以知道每个盘子里至少有一个苹果,也就是说这种情况的总数为 f ( n-k , k ) 。而有空盘的情况,我们可以假设最后一个盘子为空,则这种情况的总数为

f ( n , k-1 ) (无需考虑多个盘子为空的情况,递归时必然会出现)所以状态转移方程为 f ( n , k ) = f  ( n-k , k ) +  f ( n , k-1 )。

而如果是不允许有空盘子的情况,则可以由上面的情况推出,设 d ( n , k ) 表示把n个苹果放到k个盘子里,不允许有空盘子的方法总数,则有

f ( n , k ) =  Σ (  1 <= i <= k ) d ( n , i ) 所以 d ( n , k ) = f ( n , k ) – f ( n , k-1 )

最后是把整数n进行划分的情况,不指定k,例如7, 可以分为(7),(6,1),(5,2),(4,3),(5,1,1),(4,2,1),(3,3,1),(3,2,2),(4,1,1,1),(3,2,1,1),(2,2,2,1),(2,2,1,1,1),(3,1,1,1,1),

(2,1,1,1,1,1),(1,1,1,1,1,1,1)等情况,设 t ( n , k ) 表示这种方法的总数,有 t ( n ) = Σ (  1 <= i <= n ) d ( n , i )。

点赞