1. 程式人生 > 實用技巧 >Python|0-1揹包問題丨動態規劃

Python|0-1揹包問題丨動態規劃

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

以下文章來源於騰訊雲 作者:演算法與程式設計之美

( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )

前言

對學演算法的同學來說,動態規劃是其必學且較為重要的問題之一;其中0-1揹包問題是最經典的動態規劃問題;本部落格也主要以動態規劃來解決0-1揹包問題。

問題描述

有如下的揹包的重量及其所對應的質量,揹包的最大承受重量為6kg,試問要怎樣裝入才能使得揹包再最大的承受重量的範圍內裝入的物品的質量最大?

動態規劃進行問題分析

首先我們的創一個dp[i][j]的陣列,bag[index]陣列表示物品的重量與質量;

(bag[index][0]表示重量,bag[index][1]表示質量);其中的i來表示物品,j來表示當前揹包所能承受的最大重量;dp[i][j]來表示當前揹包重量為j時所能承裝的最大質量,這時我們可以等到一個動態的轉移方程:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-bag[index][0]]+bag[index][1])

方程解析;當我們去遍歷物品的時候我們會分兩種情況,即裝與不裝;

不裝入該物品:dp[i][j]的質量就是上個物品的質量,即就等於dp[i-1][j];i表示物品,就是i-1的質量。

裝入該物品:dp[i-1][j-bag[index][0]]+bag[index][1],i表示當前的第i個物品,i-1表示上一個物品,因為j表示當前揹包所能承裝的最大質量,所以j-bag[index][0]表示若要裝入物品,那麼必須取上一個物品的揹包最大容量(即第i-1個物品)為j-bag[index][0],因為這樣裝入第i個物品剛好裝滿容量為j的揹包。

程式碼解決

bag, n, dp = [[6,3],[10,1],[5,2],[10,4]], 6, []# bag表示物品的重量與其所對應的質量,n為揹包最大容量for i in range(len(bag)): dp.append([0]*(n+1))for i in range(n+1):    if i >= bag[0][1]: dp[0][i] = bag[0][0]    #第一次遍歷陣列將得到第一個物品所對應的最大質量得出for i in range(1,len(bag)):    for j in range(n+1):        if bag[i][1] <= j:            dp[i][j] = max(dp[i-1][j], dp[i-1][j-bag[i][1]]+bag[i][0])            # 取dp[i][j]當前的最大質量print(dp[-1][-1]) # 列印dp最終j=n(揹包最大容量)的最大質量

總結

本部落格主要講述瞭如何用動態規劃來解決0-1揹包問題;總的來說,0-1揹包問題就是經典的動態規劃問題,用dp陣列來記憶所需的值來推導相關聯的下一個值即可。