回溯法 0 1揹包問題

2021-05-04 17:12:39 字數 985 閱讀 8828

0-1揹包問題:給定n種物品和一揹包.物品i的重量是wi, 其價值為ui,揹包的容量為c.

問如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?

分析:

0-1揹包是子集合選取問題,一般情況下0-1揹包是個np問題.

第一步 確定解空間:裝入哪幾種物品

第二步 確定易於搜尋的解空間結構:

可以用陣列p,w分別表示各個物品價值和重量。

用陣列x記錄,是否選種物品

第三步 以深度優先的方式搜尋解空間,並在搜尋的過程中剪枝

我們同樣可以使用子集合問題的框架來寫我們的**,和前面子集和數問題相差無幾。

#include

#include

using namespace std;  

class knapsack  

void knapsack()  

void backtrack(int i)  

return;  

}  

if(cw + w[i] <= c)  

cx[i] = 0;  

backtrack(i+1);//搜尋左子樹  

}  

void printresult()  

cout << endl;  

}  

private:  

double *p,*w;  

int n;  

double c;  

double bestp,cp,cw;//最大價值,當前價值,當前重量  

int *x,*cx;  

};  

int main(),w[4] = ;  

knapsack ks = knapsack(p,w,4,7);  

ks.knapsack();  

ks.printresult();  

return 0;  

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個 ...

回溯法 0 1揹包問題

時限 1000ms記憶體限制 10000k總時限 3000ms 描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入 多個測例,每個測例的輸入佔三行...