概述
大致分為以下幾類:
- 01揹包
- 完全揹包
- 混合揹包
- 二維揹包
- 分組揹包
以及一個變式:跳樓梯模型,本質是轉移順序的改變。
揹包題基本上沒有套路,只能靠多練題,總結思路,最重要的還是把問題抽象成揹包模型的能力。
01 揹包
特點:無序加入,每個物品加一次。
完全揹包
特點:無序加入,每個物品無限加。
變式:跳樓梯模型:問跳完一段樓梯有多少種不同的方案數。
這兩者的區別就在於:
- 跳樓梯模型只有求方案數時才可以使用,而完全揹包既可以求方案數,也可以求最優解。(完全揹包除了求方案數以外,求最優解其實可以使用跳樓梯模型,但是這種寫法不普遍也不推薦。)
- 跳樓梯模型強調有序 ,即要考慮誰先放誰後放;而完全揹包強調無序,兩個物品先放後放不會影響最終答案。
- 轉移順序不同。
第三點的區別最主要體現在程式碼上:
完全揹包是外層先迴圈物品種類,然後迴圈揹包容量。這樣就可以透過人為地定一個放的順序來達到無序的效果。
跳樓梯模型是外層先迴圈揹包容量,然後迴圈物體種類。這樣就可以使後放的情況包含先放的情況。
具體區別可以看這兩個題,很明顯:
跳樓梯模型:紙幣問題2
完全揹包:紙幣問題3