回溯演算法 子集樹 0 1揹包問題

2021-08-20 12:41:20 字數 1254 閱讀 4483

0-1揹包: 即每種物品只有2 種選擇,分別為:裝入揹包或不裝入揹包,物品數和揹包容量已給定,計算裝入揹包物品的最大價值和最優裝入方案,用回溯法搜尋子集樹的演算法進行求解。對此模型我們剛好建立二叉樹( 此處為完全二叉樹)。對應的葉子節點數為: n! (n為頂點數)。

解子集樹:

約束函式: cw+w[i]*x[i]<=c。(cw:當前揹包重量;w[i]*x[i]選中揹包重量;  c:揹包容量)

深度探索截止條件:i>n。(i:當前節點;  n:節點總數)

子集樹結構:

思想: 對於每個物品若符合約束函式將當前節點加入到活動節點中 ,繼續深度探索。若不符合直接將當前節點以及子樹"剪枝"處理。當深度探索到葉子節點時。記錄下此時揹包最優值和對應的物品選擇情況。然後從當前葉子節點往上回溯,重複剛才的回溯方法 。注意:  回溯要回溯到根。再由根探索樹的另一邊子樹。當所有節點路徑回溯完即可解決問題。

回溯方法**:

void backpack(int i)

}}else}}

}

** :
/**

@回溯-0-1揹包

*/#include#include#define max 100

using namespace std;

int n; //揹包數量

int c; //揹包容量

int w[max]; //揹包內物體重量

int p[max]; //揹包內物體價值

int cp = 0; //當前揹包價值

int cw = 0; //當前揹包重量

int bestp = 0; //最優揹包價值

int x[max]; //揹包內物品進行選擇

int order[max]; //物品最終選中情況

void backpack(int i)

}}else}}

}int main()

backpack(1); // 第一件物品預設為選中

cout<

0-1揹包的動態規劃解法:

類"排列樹"法解0-1揹包:

回溯演算法 子集II

思路 該題為子集問題,與之前 組合總和問題ii 的去重思想一致,即相同一層不能有相同的元素,因此去重邏輯 if i startidex nums i nums i 1 不變,注意要先排序,將相同元素放在一起 class solution void backtrack vector int nums,...

回溯法 子集和問題

問題 給定n個正整數wi和乙個正整數m,在這n個正整數中找出乙個子集,使得子集中的正整數之和等於m。解的形式 設定乙個n元組 x0,x1,xn 1 如果wi包含在這個子集中,xi就等於1,反之等於0.boundfunction 演算法偽 package com.iteye.caoruntao.sum...

回溯演算法 0 1揹包問題

給定乙個物品集合s 1,2,3,n 物品i的重量是wi,其價值是vi,揹包的容量為w,即最大載重量不超過w。在限定的總重量w內,我們如何選擇物品,才能使得物品的總價值最大。0 1揹包問題回溯演算法的資料結構 define num 100 int c 揹包的容量 int n 物品的數量 int cw ...