演算法設計與分析--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揹包問題。問...