0 1揹包問題回溯法

2021-10-23 07:45:46 字數 1450 閱讀 1817

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

對於每乙個物品有拿和不拿兩種狀態,所以對於第i+1個物品可以在第i個物品的後面分出兩條路,一條拿,一條不拿,這樣就構造出了一顆二叉樹,我們只要搜尋每一條路徑找出最優解就行了,當揹包能容納當前物品時我們就取這個物品進入左子樹,不能拿時就不進,右子樹為不拿肯定能進,這樣遞迴每乙個物品就行了,直到遞迴到第n個結束,返回結果,在這2^n個結果中選取最優的儲存就行

我們用bool型別陣列cx記錄當前物品的獲取狀態,用x記錄最優解

#include

#include

using

namespace std;

struct node};

int n;

// 物品數

int c;

// 揹包容量

int bestp;

// 當前最優價值

int cp;

// 當前價值

int cw;

// 當前重量

bool

*x;// 當前最優解

bool

*cx;

// 當前解

node *goods;

void

backtrack

(int i)

bestp = cp;

}return;}

if(cw + goods[i]

.w <= c)

cx[goods[i]

.id]

=false

;// 不裝入揹包

backtrack

(i +1)

;// 回溯進入右子樹

}int

main()

sort

(goods, goods + n)

;//為了減少回溯的次數先排個序

backtrack(0

);cout <<

"裝入揹包的物品有:"

;for

(int i =

0; i < n; i++

) cout << endl;

cout <<

"最大價值為:"

x;delete

cx;

delete

goods;

return0;

}

物品種數n:5

揹包容量c:8

第1件物品的重量和價值:3 6

第2件物品的重量和價值:4 5

第3件物品的重量和價值:6 7

第4件物品的重量和價值:1 3

第5件物品的重量和價值:2 8

裝入揹包的物品有:第1件 第4件 第5件

最大價值為:17

回溯法 0 1揹包問題

0 1揹包問題 給定n種物品和一揹包.物品i的重量是wi,其價值為ui,揹包的容量為c.問如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?分析 0 1揹包是子集合選取問題,一般情況下0 1揹包是個np問題.第一步 確定解空間 裝入哪幾種物品 第二步 確定易於搜尋的解空間結構 可以用陣列p,w...

0 1揹包問題 回溯法

0 1揹包問題 回溯法 一 專案描述 每種物品只有2 種選擇,分別為 裝入揹包或不裝入揹包,物品數和揹包容量已給定,計算裝入揹包物品的最大價值和最優裝入方案,用回溯法搜尋子集樹的演算法進行求解。二 演算法設計 a.物品有n種,揹包容量為c,分別用p i 和w i 儲存第i種物品的價值和重量,用x i...

回溯法 0 1揹包問題

include include using namespace std class knap void knap backtrack int i 對第i個物品進行操作 return 如果沒有到葉子節點,就要對這個節點進行操作,即搜尋它的子樹,進入做左子樹表示可以選第i個,進入右子樹表示不能選第i個 ...