有序拆分:
可重:
把n拆成k個數:
- 可以看成求$\sum_{i=1}^{k}x_i=n 的正整數解組數,由組合數學公式得方案數為:C_{n-1}^{k-1} $
把n拆成若干個數:
- 可以求$\sum_{k=1}^{n}C_{n-1}^{k-1} $,由二項式定理得方案數為\(2^{n-1}\)
- 也可以遞推,方程為:$f(n)=1+\sum_{i=1}^{n-1}f(n-i) ,解得通項公式為f(n)=2^{n-1} $
把n拆成最大數不超過k的若干個數或把n拆成最大數為k的若干個數:
- 可類似上述遞推方法求得
不可重或其它限制:
- 二維遞推方程
- 無序拆分的排列
無序拆分:
可重:
性質一
- 把整數n拆分成最大數為k的拆分數,和把n拆分成k個數的拆分數相等。
性質二
- 把整數n拆分成最多不超過m個數的拆分數,和把n拆分成最大不超過m的拆分數相等。
Ferrers圖像:

把n拆成k個數:
- $f[n][k]=f[n-1][k-1]+f[n-k][k] $
- 可以理解為把\(n-1\)個數拆成\(k-1\)個再在后面加一個\(1\)和把\(n-k\)拆成\(k\)個數再給每個數加\(1\)
把n拆成不超過k個數:
- 拆成\(k\)個數求和
- 利用性質2,完全背包:$f[n][k]=f[n-k][k]+f[n][k-1] $
不可重:
把n拆成k個數:
- $f[n][k]=f[n-k][k-1]+f[n-k][k] $
- 可以理解為把\(n-k\)個數拆成\(k-1\)個后給每個數加\(1\)再在后面加一個\(1\)和把\(n-k\)拆成\(k\)個數再給每個數加\(1\)
- 由於不可重,所以可以跳過$n<\sum_{i=1}^ki $的情況
把n拆成不超過k個數:
- 拆成\(k\)個數求和
把n拆成最大不超過k的若干個數:
- 01背包:$f[n][k]=f[n-k][k-1]+f[n][k-1] $
在給出的k種數中選擇一些組合成n的方案數:
每種數有無數個:
- 完全背包:$f[n][k]=f[n-v[k]][k]+f[n][k-1] $
第k種數有a[k]個:
- 多重背包
