回溯法 0 1揹包問題

2021-08-10 10:27:19 字數 1245 閱讀 1031

時限:1000ms記憶體限制:10000k總時限:3000ms

描述

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

輸入

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

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

輸出:

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

輸入樣例

1 2

1 1

2 3

2 2

3 4

0 0輸出樣例:1 4

回溯法也稱為試探法,該方法首先暫時放棄關於問題規模大小的限制,並將問題的候選解按某種順序逐一列舉和檢驗。當發現當前候選解不可能是解時,就選擇下乙個候選解;倘若當前候選解除了還不滿足問題規模要求外,滿足所有其他要求時,繼續擴大當前候選解的規模,並繼續試探。如果當前候選解滿足包括問題規模在內的所有要求時,該候選解就是問題的乙個解。在回溯法中,放棄當前候選解,尋找下乙個候選解的過程稱為回溯。擴大當前候選解的規模,以繼續試探的過程稱為向前試探。

回溯法常見形式有搜尋排列樹和搜尋子集樹兩種型別,此題使用了搜尋子集樹的形式。

#include

using

namespace

std;

int w[10],p[10],a[10],n,c,value=0,big=0;

void search(int m);

void check();//檢測重量條件是否滿足

void checkmax();//檢測最值

int main()

return0;}

void search(int m)

else

} void check()

}if(weight<=c)

checkmax();

}void checkmax()

}if(value>big)

big=value;

}

回溯法 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個 ...