整数拆分问题

第一种

给定n,求把n拆分成若干个不相等的数的方案数。
f [ i ] [ j ] 表示把j拆成i个数。
考虑要不要新添加一个数,并把之前的数全部加一。
f [ i ] [ j ] = f [ i 1 ] [ j i ] + f [ i ] [ j i ]
由于数不相等,数的个数不超过 n
那么时空复杂度 O ( n n )

第二种

给定n,求把n拆分成若干个数的方案数,可以相同。
我们要使用到广义五边形数。
五边形数(非广义)长这样。形如 k ( 3 k 1 ) 2 (盗图)(逃
这里写图片描述
广义五边形数是 k ( 3 k + 1 ) 2 , k ( 3 k 1 ) 2
前几项是0,1,2,3,5,7,12,15,22
P ( n ) 为拆分方案数
五边形数定理: P ( n ) P ( n 1 ) P ( n 2 ) + P ( n 3 ) + P ( n 5 ) . . . = 0
其中P(0)=1,n小于0时P为0。
那么P的递推式是
P ( n ) = k 1 ( 1 ) k + 1 [ P ( n k ( 3 k + 1 ) 2 ) + P ( n k ( 3 k 1 ) 2 ) ]
注意到k的级别是 n 的,那么时间复杂度也是 O ( n n )

猜你喜欢

转载自blog.csdn.net/zltjohn/article/details/80181099