演算法設計與分析 01揹包問題(動態規劃法解決)

2021-08-21 08:59:52 字數 1459 閱讀 7977

演算法設計與分析--01揹包問題(動態規劃法解決)

這個學期開的演算法設計與分析課程老師說是研究生才要學的課,但是我們大二就要學!

上機課題目有一道0-1揹包的問題,上課的時候由於沒有聽課。。所以只有自己再啃書本了。

**雖然不長,但是還是。。很有。。技術含量的。

本人文筆不是很好,所以就 不多說啦!直接上菜!

問題描述:

給定n中物品和乙個揹包。物品i的重量是wi,其價值位vi ,揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大??

在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0-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)  ji  

v(i,j)=max j>wi

(1)式表明:如果第i個物品的重量大於揹包的容量,則裝人前i個物品得到的最大價值和裝入前i-1個物品得到的最大價是相同的,即物品i不能裝入揹包;第(2)個式子表明:如果第i個物品的重量小於揹包的容量,則會有一下兩種情況:(a)如果把第i個物品裝入揹包,則揹包物品的價值等於第i-1個物品裝入容量位j-wi 的揹包中的價值加上第i個物品的價值vi;(b)如果第i個物品沒有裝入揹包,則揹包中物品價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。顯然,取二者中價值最大的作為把前i個物品裝入容量為j的揹包中的最優解。

1 #include23

int v[

200][

200];

//前i個物品裝入容量為j的揹包中獲得的最大價值

4int max(

int a,

int b)

5  10

11int knapsack(

int n,

int w,

int v,

int x,

int c)

12 

32else

33                 x[i]=

0; 34             }

35             printf(

"選中的物品是:\n

");

36for(i=

0;i37                 printf(

"%d 

",x[i]);

38             printf(

"\n");

39return v[n-

1][c];

4041 }

4243void main()

44 

演算法設計與分析--01揹包問題(動態規劃法解決)

演算法設計與分析 0 1揹包問題

問題描述 給定n個重量為,價值為的物品和乙個容量為c的揹包,0 1揹包問題是求這些物品中的乙個 最有價值的子集,並且能夠裝入揹包中。基本演算法思想 暴力法 用暴力法解決0 1揹包問題,需要考慮給定n個物品集合的所有子集,找出所有重量不超過揹包重量的子集,計算其每個子集的 總價值,比較輸出價值最大的那...

演算法設計 0 1揹包問題(動態規劃)

給定n種物品和一揹包 wi 物品i的重量 vi 物品i的重量價值 c 揹包的容量 問 應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?p i j 代表可選擇物品為前i個,揹包容量為j時的最大價值 當j w i 時我們需要判斷v i p i 1 j w i 與p i 1 j 的大小來對p i...

演算法設計與分析 01揹包問題(動態規劃法解決)

問題描述 給定n中物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問題。問...