整數拆分


有序拆分:

可重:

把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]個:

  • 多重背包


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM