動態規劃之揹包問題 python實現

2021-08-01 03:32:41 字數 2604 閱讀 3844

題目描述:有編號分別為1,2,3,4,5的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?

動態規劃的核心過程有兩部分,乙個是找出問題的」子狀態」,再乙個就是建立「狀態轉移方程」(所謂的遞推公式)。將上面的問題解決,動態規劃就解了一般,剩下的為**將數學的公式的進行實現。

- 動態規劃的思路。先將原始問題一般化,欲求揹包能夠獲得的總價值,即欲求前i個物體放入容量為m(kg)揹包的最大價值c[i][m]——使用乙個陣列來儲存最大價值,當m取10,i取3時,即原始問題了。而前i個物體放入容量為m(kg)的揹包,又可以轉化成前(i-1)個物體放入揹包的問題。下面使用數學表示式描述它們兩者之間的具體關係。

- w[i]:第i個物體的重量

- p[i]:第i個物體的價值

- c[i][j]:前i個物體放入容量為j 包的最大價值

- c[i-1][j]:前i個物體放入容量為j 包的最大價值

- c[i-1][j-w[i]]:前i-1個物體放入容量為j-w[i] 包的最大價值

以下通過**來說狀態轉移方程

首先明確該表是至底向上,從左到生成的。且上邊abcde帶代表編號5,4,3,2,1

以下開始用python程式設計

#n:物品件數;c:最大承重為c的揹包;w:各個物品的重量;v:各個物品的價值

#第一步建立最大價值矩陣(橫座標表示[0,c]整數揹包承重):(n+1)*(c+1)

#技巧:python 生成二維陣列(陣列)通常先生成列再生成行

defbag(n,c,w,p):

res=[[-1

for j in range(c+1)]for i in range(n+1)]

for j in range(c+1):

#第0行全部賦值為0,物品編號從1開始.為了下面賦值方便

res[0][j]=0

for i in range(1

:n+1):

for j in range(1

:c+1):

res[i][j]=res[i-1][j]

#生成了n*c有效矩陣,以下公式w[i-1],p[i-1]代表從第乙個元素w[0],p[0]開始取。

if(j>=w[i-1]) and res[i-1][j-w[i-1]]+p[i-1]>res[i][j]:

res[i][j]=res[i-1][j-w[i-1]]+p[i-1]

return res

#以下**功能:標記出有放入揹包的物品

#反過來標記,在相同價值情況下,後一件物品比前一件物品的最大價值大,則表示物品i#有被加入到揹包,x陣列設定為true。設初始為j=c。

defshow(n,c,w,res):

print('最大價值為:',res[n][c])

x=[false

for i in range(n)]

j=c

for i in range(1,n+1):

if res[i][j]>res[i-1][j]:

x[i-1]=true

j-=w[i-1]

print '選擇的物品為:'

for i in range(n):

if x[i]:

print '第',i,'個,'

該題與揹包問題有以下等價

#轉化為列表之後不能直接int(list)

n=int(sys.stdin

.readline().strip())

#正確解法:需要對列表內每個數int();使用raw_input()不會讀取回車,sys.stdin()會讀取回車鍵

dat=[int(x) for x

in raw_input().strip().split()]

c=dat[0];p=;v=

m=len(dat)

for i in range(1,m,2):

for j in range(2,m,2):

資料處理完後將對應的帶入揹包問題的bag函式中即可得到結果。

動態規劃之揹包問題

最近刷題遇到好幾道揹包問題,揹包問題是動態規則中的一類體型,在考察演算法的筆試中經常遇到。關於揹包問題,文章 揹包問題九講 中已經做了很多分析,這裡就不再細述,建議好好看看這篇文章。然而文章給了許多案例分析,卻沒有很好的練習。說明 1 本文目的不在於講解揹包問題的分析與講解,而是收集了一些揹包問題。...

動態規劃之揹包問題

一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 根據動態規劃解題步驟 問題抽象化 建立模型 尋找約束條件 判斷是否滿足最優性原理 找大問題與小問題的遞推關係式 填表 尋找解組成 找出01揹包問題的最優解以及解組成,然後編...

動態規劃之 揹包問題

前些天在做動態規劃的題,感覺動態規劃博大精深,沒有一種特定的模式,學起來很費勁。在這裡就動態規劃中的揹包問題談談。三種揹包問題 0 1揹包,完全揹包,多重揹包。0 1揹包 有n件物品和容量為v的揹包,求解將哪些物品放入揹包中可以使獲得的價值最大。f i v 表示將前i件物品恰好放入容量為v的揹包可以...