0 1揹包問題

2021-09-30 14:21:28 字數 1506 閱讀 3629

0-1揹包問題:有乙個揹包最多能裝**積為volume的東西,volume為一正整數。有number件物品,第j件物品重weight[j],價值value[j],其中1

部分揹包問題:在0-1揹包問題中,如果某件物品可以帶走一部分,那麼我們稱該問題是部分揹包問題。

部分揹包問題可以用貪心演算法求解,也就是每次都帶走單位價值最高的物品,但是0-1揹包問題則不能用貪心演算法來求解。例如有乙個揹包容量是5,有3件物品,重量分別是1,2,3;價值分別是60,100,120,;如果按照貪心演算法來求解,那麼就帶走第1,2,兩件物品,總價值是160,但是最大價值其實是220,也就是應該帶走第2,3兩件物品。

下面我們用動態規劃和深度優先遍歷兩種方法來求解0-1揹包問題。

法1:動態規劃法

#includeusing namespace std;

//動態規劃法解0-1揹包問題

int knapsack(int* weight,int* value,int number,int volume)

else

}}

} cout<=0)

深度優先遍曆法:

我們利用深度優先遍歷至每個葉子節點,求出a,b,c,d的全部組合,然後選出價值最大的方案。

解答樹如下所示:

其中0表示放入,1表示不放。

#includeusing namespace std;

const int n=100;

int ans=0;//利用全域性變數ans儲存解

int item_number;//物品件數

int knap_size;//揹包大小

int weight[n]; //物品重量

int value[n];//物品價值

int x[n];//解向量

void dfs(int cur_depth,int cur_size,int cur_value)

if(cur_size>knap_size)

if(cur_value>ans)

ans=cur_value;

x[cur_depth]=0;

dfs(cur_depth+1,cur_size,cur_value);//第cur_depth物品不取

x[cur_depth]=1;

dfs(cur_depth+1,cur_size+weight[cur_depth],cur_value+value[cur_depth]);//第cur_depth物品取

}int main()

cout

} cout

dfs(0,0,0);//呼叫dfs函式

cout<

例子:

揹包問題 01揹包問題

n個物品,總體積是v,每個物品的體積的vi,每個物品的最大價值是wi,在不超過v的體積下求最大價值 eg揹包容積為 5 物品數量為 4 物品的體積分別為 物品的價值分別為 思路定義乙個二位陣列int f new int n 1 v 1 f i j 就表示在1 i個物品中選取體積小於v的情況的最大價值...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...