動態規劃之01揹包問題(最易理解的講解)

2021-06-07 14:02:50 字數 2173 閱讀 7387

01揹包問題,是用來介紹動態規劃演算法最經典的例子,網上關於01揹包問題的講解也很多,我寫這篇文章力爭做到用最簡單的方式,最少的公式把01揹包問題講解透徹。

f[i,j]表示在前i件物品中選擇若干件放在承重為 j 的揹包中,可以取得的最大價值。

pi表示第i件物品的價值。

決策:為了揹包中物品總價值最大化,第 i件物品應該放入揹包中嗎 ?

題目描述:

假設山洞裡共有a,b,c,d ,e這5件寶物(不是5種寶物),它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的揹包, 怎麼裝揹包,可以才能帶走最多的財富。

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

name

weight

value12

3456

78910

a260

6699

1212

151515b

2303

3669

991011c6

5000

6666

61011d

5400

0666

661010e4

6000

6666

666

只要你能通過找規律手工填寫出上面這張表就算理解了01揹包的動態規劃演算法。

首先要明確這張表是至底向上,從左到右生成的。

為了敘述方便,用e2單元格表示e行2列的單元格,這個單元格的意義是用來表示只有物品e時,有個承重為2的揹包,那麼這個揹包的最大價值是0,因為e物品的重量是4,揹包裝不了。

對於d2單元格,表示只有物品e,d時,承重為2的揹包,所能裝入的最大價值,仍然是0,因為物品e,d都不是這個揹包能裝的。

同理,c2=0,b2=3,a2=6。

對於承重為8的揹包,a8=15,是怎麼得出的呢?

根據01揹包的狀態轉換方程,需要考察兩個值,

乙個是f[i-1,j],對於這個例子來說就是b8的值9,另乙個是f[i-1,j-wi]+pi;

在這裡,

f[i-1,j]表示我有乙個承重為8的揹包,當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值

f[i-1,j-wi]表示我有乙個承重為6的揹包(等於當前揹包承重減去物品a的重量),當只有物品b,c,d,e四件可選時,這個揹包能裝入的最大價值

f[i-1,j-wi]就是指單元格b6,值為9,pi指的是a物品的價值,即6

由於f[i-1,j-wi]+pi = 9 + 6 = 15 大於f[i-1,j] = 9,所以物品a應該放入承重為8的揹包

以下是actionscript3 的**

public function get01packageanswer(bagitems:array,bagsize:int):array

else

}else

else

bagmatrix[j][i] = (bagmatrix[j-1][i] > iteminbag ? bagmatrix[j-1][i] : iteminbag)}}

}//find answer

var answers:array=;

var cursize:int = bagsize;

for(i=bagitems.length-1;i>=0;i--)

if(i==0 && cursize > 0)

if(bagmatrix[i][cursize]-bagmatrix[i-1][cursize-item.weight]==item.value)

}return answers;

}

packageitem類

public class packageitem

}

測試**

var namearr:array=['a','b','c','d','e'];

var weightarr:array=[2,2,6,5,4];

var valuearr:array=[6,3,5,4,6];

var bagitems:array=;

for(var i:int=0;i

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...

動態規劃之0 1揹包問題

問題描述 0 1揹包問題是應用動態規劃設計求解的典型例題 已知n種物品和乙個可容納c重量的揹包,物品i的重量為w i 產生的效益為p i 在裝包時物品i可以裝入,也可以不裝,但不可拆開裝。問如何裝包,所得裝包總效益最大。演算法分析 最優子結構特性 0 1揹包的最優解具有最優子結構特性。與一般揹包問題...