0 1揹包的遞迴與非遞迴實現

2022-03-05 02:33:34 字數 1518 閱讀 2267

1/*0-1揹包遞迴*/

2#include2 #include 3

using

namespace

std;45

int w=;//

物品重量陣列

6int v=;//

物品價值陣列

7int contain=5;//

揹包容量

8int y[4]=;//

解向量,y[i]=1表示選取物品,y[i]=0表示不選取物品910

int f(int n,int

contain)

1115

else

1625

else

2635

else

3640}41

}42}43

}44intmain()

4553

}54 cout<<"

maximum value is

"55return0;

5657 }

1

/*0-1揹包非遞迴

*/2 #include "

stdio.h"3

#define n 10045

intmain()631

32void knapsack(int v,int w,int c,int n,int m[1000

])33

//v:價值,w:重量,c:揹包可容納重量,n:物品件數

34//

m:存放最大總價值的陣列

35//

m[i][j]表示揹包容量為j,可選擇物品為i,i+1,...,n時0-1揹包問題的最優值

3667

//到此為止,已經求出可選擇物品為(第n-1件、第n件),(第 n-2件、第n-1件、第 n件),...,(第 2件、第 3件...第 n 件) 在重量 k(0<=k<=c)情況下的最優值

68//

接下來是求可選擇物品為(第 1件、第 2件...第 n件) 在重量 k(0<=k<=c)情況下的最優值嗎?

69//

no!只需求可選擇物品為(第 1件、第 2件...第 n件) 在重量 c(真正的揹包容量)下的最優值

70 m[1][c]=m[2][c]; //

假設不放入第一件物品

71 t=w[1

];72

if(w[1]<=c) m[1][c]=m[1][c]>=m[2][c-t]+v[1]?m[1][c]:m[2][c-t]+v[1

];73

//可以容納第一件物品的情況下,該如何選擇?74}

75}7677

void traceback(int v,int w,int c,int n,int m[1000],int

x)78

93if(m[n][c]>0) //

單獨判斷是否選擇了第 n件物品

94 x[i]=1

;

95else x[i]=0

;96 }

簡單揹包問題 遞迴非遞迴實現

include define max 100 int w max int ans int s,int m if b return 0 else int ans int s,int m stacknode stacknode stack max int i,j,t,top,nofail t 0 top...

01揹包問題 遞迴實現

問題描述 乙個揹包裡可以放入重量為 weight 的物品,現有 n 件物品的集合 s,其中物品的重量分別為 w0,w1.求解 假設如果不選最後一件物品 其重量是 如果選擇最後一件物品,那麼如果 def knap weight,wlist,n weight為包的容量,wlist是乙個所有重量的表,n為...

C 實現0 1揹包問題 動態規劃 非遞迴

前兩天在華為筆試題的時候遇到了這個問題,做完之後發現自己有欠缺,回來趕緊複習一下 不說太多了,直接把 貼出來,任何繁瑣的理論都不如 看著直接,我在 中進行了詳細的注釋,保證只要看懂並理解了關鍵的幾句 及注釋,0 1揹包問題就變得很簡單,原理什麼的網上的部落格很多,給大家分享幾個比較好的參考鏈結 c ...