0 1揹包(回溯法)

2021-07-10 22:06:30 字數 1022 閱讀 9800

描述:

需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi ,價值為pi 。對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。

輸入:

多個測例,每個測例的輸入佔三行。第一行兩個整數:n(n<=10)和c,第二行n個整數分別是w1到wn,第三行n個整數分別是p1到pn。

n 和 c 都等於零標誌輸入結束。

輸出:

每個測例的輸出佔一行,輸出乙個整數,即最佳裝載的總價值。

輸入樣例:

1 211

2 32 2

3 40 0

輸出樣例:

1

4

#include #include using namespace std;

double c; //揹包容量

int n; //物品數

double cw; //當前重量

double cp; //當前價值

int bestp; //當前最優價值

typedef struct item

item;

item item[100];

bool cmp(item a, item b)

double bound(int i)

//將最後一件裝不下的物品拆解,讓揹包裝滿

//計算能裝載容量的最大上界

if(i <= n)

b += item[i].p/item[i].w*cleft;

return b;

}void backtrack(int i)

//搜尋子樹

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

if(bound(i+1) > bestp)

backtrack(i+1);

}int main()

return 0;

}

01揹包回溯法

計算機演算法基礎 第三版 余祥宣 崔國華 等 華中科技大學出版社 中回溯法解決01揹包問題 演算法思想 基於貪心演算法的回溯演算法 w p陣列是按照效益p w拍好序的陣列 include const int n 8 物品個數 const int m 110 int w n 1 重量陣列,從1開始 i...

0 1揹包 回溯法

include include include using namespace std define n 100000 int n,c int cp 0,cw 0,bestp 0 cp是當前價值,cw是當前重量,bestp是當前最優值。int w n p n x n bestx n bestx陣列是...

0 1揹包 回溯法

演算法描述 0 1揹包的回溯法,與裝載問題的回溯法十分相似。在搜尋解空間樹時,只要其左兒子結點是乙個可行結點,搜尋就進入其左子樹。當右子樹中有可能包含最優解時才進入右子樹進行搜尋。否則將右子樹剪去。計算右子樹上界的更好演算法是 將剩餘物品依其單位重量價值排序,然後依次裝入物品,直至裝不下時,再裝入該...