揹包問題01 乙個揹包引發血案

2022-04-10 13:12:25 字數 1724 閱讀 4454

連續揹包問題:

還是先講一段故事吧。假如你是乙個賊,有一天你去地主家偷東西。有4斤金沙,2斤銀沙,10斤銅沙。

但是運氣不好的是,你的包只能裝8斤東西。那麼你該偷什麼走呢?

我們這邊把這個問題分解成 方程式和約束條件

方程式:gx + sy + cz --->max #gsc分布代表金銀銅

約束條件:x+y+z = 8

g>s>z

max(g)=4 max(s)=4 max(c)=4

這裡這個問題,是貪心演算法的主場,當然有很多解決問題的方法,我們的目的就是找到最優秀的解,我們先保證裝足夠多的金子,然後如果金子裝完了,

而且還有剩餘空間的話,就裝足夠多的銀子。。。。在連續問題裡,貪心演算法的確可以得到最優解,貪心演算法的核心就是就是保證區域性的優越性,、

但是保證區域性的優越性,並不能保證整體的優越性。我們這邊先不深入說貪心演算法。我們接著說揹包問題。

0/1揹包問題:

有乙個包和n個物品,包的容量為m,每個物品都有各自的體積和價值,問當從這n個物品中選擇多個物品放在包裡而物品體積總數不超過包的容量m時,能夠得到的最大價值是多少?[對於每個物品不可以取多次,最多只能取一次,之所以叫做01揹包,0表示不取,1表示取]

這裡我們當然可以用貪心演算法,和窮舉演算法,

但是它們都有乙個致命的缺點 貪心演算法:往往得不到最優解 窮舉花費的時間又太多了

這裡就需要乙個新的演算法了---》動態規劃(dynamic programming)--->本質上它是對窮舉演算法的優化

動態規則:首先不要通過他的名字去理解它,它只是乙個名字而已,呵呵

好累呀、、、、要不要先休息一會。

我們先談論子結構的問題吧

def fib(n):

global numcails

numcails +=1

print "numcails-->",numcails

print "n---->",n

if n <=1:

return n

else:

return fib(n-1) + fib(n-2)

我們先看這段**,如果我傳了fib(5). 他會遞迴 n-1 n-2 然後接著。

這段**的問題就是,他有很多重複的子結構

這個是fib(5)的輸出,你可以看到他有很多相同的子結構

numcails--> 1n----> 5numcails--> 2n----> 4numcails--> 3n----> 3numcails--> 4n----> 2numcails--> 5n----> 1numcails--> 6n---->0

numcails--> 7n----> 1numcails--> 8n----> 2numcails--> 9n----> 1numcails--> 10n---->0

numcails--> 11n----> 3numcails--> 12n----> 2numcails--> 13n----> 1numcails--> 14n---->0

numcails--> 15n----> 1

那麼dp是如何解決的呢? 

我們先看下圖 我們要從a-f

一共有多少中方案呢?

這個是乙個很簡單的問題 但是不知道你有沒有關注到d 這個重合節點的。

而dp的核心就是尋找最優子結構,說白了就是沒有重合的子結構。

揹包問題(一) 0 1揹包問題

揹包問題有多種,比如 問題1 物品受限揹包,第i種物品最多取ni個 問題2 0 1揹包,本文即將介紹,xi 0或者1,i 1 2 3.n 問題3 多揹包問題,m個揹包,揹包j裝入最大重量bj,j 1 2 3.m,在滿足所有揹包重量約束 條件下使得裝入物品價值最大 問題4 二維揹包,每件物品有wi和體...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...