從01揹包問題理解動態規劃

2021-07-10 22:05:28 字數 4094 閱讀 4868

01揹包問題具體例子:假設現有容量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)個物體放入揹包的問題。下面使用數學表示式描述它們兩者之間的具體關係。

表示式中各個符號的具體含義。

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

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

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

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

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

由此可得:

c[i][m]=max(下圖將給出更具體的解釋)

根據上式,對物體個數及揹包重量進行遞推,列出乙個**(見下表),**來自( ,當逐步推出表中每個值的大小,那個最大價值就求出來了。推導過程中,注意一點,最好逐行而非逐列開始推導,先從編號為1的那一行,推出所有c[1][m]的值,再推編號為2的那行c[2][m]的大小。這樣便於理解。

思路釐清後,開始程式設計序,c語言**如下所示。

#include int c[10][100]=;

void knap(int m,int

n)

}

intmain()

}

**中,紅色字型部分是自己寫的,其餘的參照了這篇部落格http:

如果你很輕鬆地就突破了01揹包,甚至很輕鬆地就理解了動態規劃,那麼繼續前進,做一下這道題目(很好玩的。

小結:感謝上面引用的兩篇部落格,也感謝這兩位博主,沒有你們的部落格,我恐怕對01揹包問題還是半懂不懂的。

ps: 2014/5/19  更新乙個遞迴解法,《演算法:c語言》似乎也有乙個遞迴解法,不過是錯誤的:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

#include

#include

typedefstruct_item

item;

item aitem[5] = , , , , };

intitem_flag[5];// 0: 未訪問, 1:

intresult[5] ;// 儲存中間輸出結果

intmount = 0;

intmax;

voidknap_rcs(intcap)

}

else// 已到遞迴終點,輸出結果

}

}

intmain()

max = 0;

knap_rcs(n);

printf("max value: %d\n\n", max);

}

system("pause");

return0;

}

從01揹包問題理解動態規劃

01揹包問題具體例子 假設現有容量10kg的揹包,另外有3個物品,分別為a1,a2,a3。物品a1重量為3kg,價值為4 物品a2重量為4kg,價值為5 物品a3重量為5kg,價值為6。將哪些物品放入揹包可使得揹包中的總價值最大?動態規劃的思路 先將原始問題一般化,欲求揹包能夠獲得的總價值,即欲求前...

動態規劃揹包問題 01揹包

問題描述 n種物品,每種乙個。第i種物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包,使得揹包內物品不超過c的前提下,重量最大。問題分析 宣告乙個f n c 的陣列。f i j 表示把前i件物品都裝到容量為j的揹包所獲得的最大重量。當 j v i 時,揹包容量不足以放下第 i 件物品,f ...

動態規劃 揹包問題 01揹包

有n種物品和乙個容量為v的揹包,每種物品僅用一次。第i件物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使價值總和最大。例如 n 5,v 10 重量 價值 第乙個物品 10 5 第二個物品 1 4 第三個物品 2 3 第四個物品 3 2 第五個物品 4 1 首先我們考慮貪心策略,選取最大價...