01背包問題-通俗易懂

尊重勞動成果,轉載請注明

github地址:
https://github.com/arkulo56/thought/blob/master/software/algorithm/%E7%AE%97%E6%B3%95---01%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98.md


有編號為a、b、c、d、e的5件物品,他們的重量分別是2、2、6、5、4,他們的價值分別是6、3、5、4、6,現在給你一個承重為10的背包,如何讓背包里裝的物品擁有最大的價值??

一、讓我們先用現實生活來還原一下這個場景:

去出差,襯衫、西服、領帶、剃須刀...都已經裝進包里了,手里拿著ipad在猶豫帶不帶(因為包已經裝不下了)?

1)第一種情況:不帶了,包就這么大,現在包里的東西出差就夠用了!

2)第二種情況:必須要帶,因為ipad里有重要的ppt,那就只能在包里預留出ipad空間,看看剩下的空間怎么擺放那些必須要帶的東西!

到底怎么做才是最合理(價值最大化)?#####
二、一些數學的東西

n代表東西的數量、c代表包的最大承重、Wi是第i件物品的重量、Pi是第i件物品的價值、F[i,j]是最大價值(i個物品放入承重j的包)

那真實場景中的問題用數學的方式來表達,如果要求F[i,j]的最大值,則要看這兩種 狀態

第一種情況(不帶):F[i-1,j]
第二種情況(帶):F[i-1,j-Wi]+Pi (j>= Wi) (在背包中給ipad預留空間Wi,剩下的i-1件物品重新擺放,最后在加上ipad的價值Pi)

那什么才是最合理?也就是價值最大化?那就是看這兩種情況哪種更有利于我出差! 狀態轉換方程

F[i,j] = MAX(F[i-1,j], F[i-1,j-Wi]+Pi)

是不是悟出了些規律,最大值取決于ipad裝與不裝,同時也取決于之前的i-1個物品!

三、接下來請看看這張圖,先明白原理

<img src="https://raw.githubusercontent.com/arkulo56/thought/master/images/algorithm/beibao.png" width="600" />

有了這張圖和上面總結的公式,我們就可以很清晰的理解01背包算法了

  1. e2單元格:當只有一件物品e,包的容量是2時,裝不進去,所以最大值為0
  2. a8單元格:物品包括a、b、c、d、e,容量為8時,F[i-1,j]=F[b,8]=9,F[i-1,j-Wi]+Pi=F[b,6]+6=9+6=15,兩種情況取最大值,因此這里的最大值是15
  3. 其他單元格依此類推...
五、代碼代碼

還沒有寫,稍后補充...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容