題目描述:有編號分別為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的揹包可以...