**:
#include using namespace std;n 代表的是物品個數const int m = 100; //設物品最多100個
int n, maxwight, sumvalue;
int wight[m], value[m], ans[m], a[m];
void backtrack(int t, int swight, int svalue)
}else
else //實際重量大於最大重量時,從揹包把物品拿出。}}
}int main()
maxwight 揹包能裝的最大體積
sumvalue 物品的最大價值
ans 陣列,最終選擇方式
a 陣列,臨時選擇方式
思路:物品只有兩種選擇,放或者不放,構造二叉樹,n 個物品就是 n 層樹,然後進行最優值更新。
樣例:
圖1揹包構造出的二叉樹如圖1,順序三從右邊到左邊,也就是先不放物品,然後再慢慢放進去。
輸入:3 30
45 25 25
16 15 15
輸出:
0 1 1 :放進後面 2 件物品。 50 : 最大價值
附回溯法搜尋子集樹模板:
void backtrack(int k)}}
01揹包回溯法
計算機演算法基礎 第三版 余祥宣 崔國華 等 華中科技大學出版社 中回溯法解決01揹包問題 演算法思想 基於貪心演算法的回溯演算法 w p陣列是按照效益p w拍好序的陣列 include const int n 8 物品個數 const int m 110 int w n 1 重量陣列,從1開始 i...
0 1揹包(回溯法)
描述 需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入 多個測例,每個測例的輸入佔三行。第一行兩個整數 n n 10 和c,第二行n個整數分別是w1到...
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陣列是...