假設有一個背包的負重最多可達8公斤,而希望在背包中裝入負重範圍内可得之總價物品,假設是水果好了,水果的編号、單價與重量如下所示:
李子
4kg
nt$4500
1
蘋果
5kg
nt$5700
2
橘子
2kg
nt$2250
3
草莓
1kg
nt$1100
4
甜瓜
6kg
nt$6700
解法背包問題是關于最佳化的問題,要解最佳化問題可以使用「動态規劃」(dynamic programming),從空集合開始,每增加一個元素就先求出該階段的最佳解,直到所有的元素加入至集合中,最後得到的就是最佳解。
以背包問題為例,我們使用兩個陣列value與item,value表示目前的最佳解所得之總價,item表示最後一個放至背包的水果,假設有負重量 1~8的背包8個,并對每個背包求其最佳解。
逐漸将水果放入背包中,并求該階段的最佳解:
放入李子
背包負重
5
6
7
8
value
0
4500
9000
item
-
放入蘋果
5700
放入橘子
2250
6750
7950
放入草莓
1100
3350
6800
9050
放入甜瓜
由最後一個表格,可以得知在背包負重8公斤時,最多可以裝入9050元的水果,而最後一個裝入的 水果是3号,也就是草莓,裝入了草莓,背包隻能再放入7公斤(8-1)的水果,是以必須看背包負重7公斤時的最佳解,最後一個放入的是2号,也就 是橘子,現在背包剩下負重量5公斤(7-2),是以看負重5公斤的最佳解,最後放入的是1号,也就是蘋果,此時背包負重量剩下0公斤(5-5),無法 再放入水果,是以求出最佳解為放入草莓、橘子與蘋果,而總價為9050元。
實作