參考
【問題描述】
給定n中物品和乙個揹包。物品i的重量是wi,其價值位vi ,揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0-1揹包問題。
例如:假設現有容量10kg的揹包,另外有3個物品,分別為a1,a2,a3。物品a1重量為3kg,價值為4;物品a2重量為4kg,價值為5;物品a3重量為5kg,價值為6。將哪些物品放入揹包可使得揹包中的總價值最大?
【分析】動態規劃法的思路:將原始問題一般化,欲求揹包能夠獲得的總價值,即欲求前i個物體放入容量為m(kg)揹包的最大價值c[i][m]--使用乙個陣列來儲存最大價值,當m取10,i取3時,即原始問題了。前i個物體放入容量為m(kg)的揹包,又可以轉化為前i-1個物體放入揹包的問題。下面使用數學表示式描述它們兩者之間的具體關係。
令v(i,j)表示在前i(1<=i<=n)個物品中能夠裝入容量為就j(1<=j<=c)的揹包中的物品的最大價值,則可以得到如下的動態規劃函式:
(1) v(i,0)=v(0,j)=0
(2) v(i,j)=v(i-1,j) j(3) v(i,j)=max j>wi
其中(2)式表明:如果第i個物品的重量大於揹包的容量,則裝入前i個物品得到的最大價值和裝入前i-1個物品得到的最大價值是相同的,即物品i不能裝入揹包;第(3)個式子表明:如果第i個物品的重量小於揹包的容量,則會有以下兩種情況:(a)如果把第i個物品裝入揹包,則揹包物品的價值等於第i-1個物品裝入容量位j-w
i 的揹包中的價值加上第i個物品的價值v
i; (b)如果第i個物品沒有裝入揹包,則揹包中物品價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。顯然,取二者中價值最大的作為把前i個物品裝入容量為j的揹包中的最優解。
根據上式,對物體個數及揹包重量進行遞推,列出乙個**(見下表),**來自( ,當逐步推出表中每個值的大小,那個最大價值就求出來了。推導過程中,注意一點,最好逐行而非逐列開始推導,先從編號為1的那一行,推出所有c[1][m]的值,再推編號為2的那行c[2][m]的大小。這樣便於理解。
0 1揹包(動態規劃解法)
動態規劃演算法通常用於求解具有某種最優性質的問題。在這類問題中,可能會有許多可行解。每乙個解都對應於乙個值,我們希望找到具有最優值的解。動態規劃演算法與分治法類似,其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的...
0 1揹包之 動態規劃解法
給定n種物品和一揹包,揹包的載重量為c 設物品i的重量是wi,其價值為pi。每件物品要麼整體裝入揹包,要麼不裝,不能拆開裝。問應如何選擇裝入揹包的物品,使得裝入揹包中的物品的總重量不超過c 總價值最大?建立數學模型 可用xi表示第i個物品是否裝入揹包 xi 1,表示裝入 xi 0,表示不裝入。乙個裝...
java 0 1揹包問題 動態規劃解法
首先簡單的介紹一下0 1揹包問題 有乙個揹包,有一定的容量,有幾件物品,物品有重量和價值,選擇物品放到揹包中,使揹包的中的物品在揹包能夠裝下的條件下,價值最大。物品只有兩種選擇,裝入或者不裝入。package ceshi public class beibao int v int c 10 int ...