「0 1揹包」 回溯演算法 C C實現

2021-10-10 18:07:32 字數 1121 閱讀 3260

#include

#include

//c++輸入輸出流標頭檔案

using

namespace std;

int n;

//總商品數量

int w;

//商品的總容量

int cp=

0,cw=0;

//當前裝入價值;當前裝入重量

int bestp=0;

//初始化最優解價值

bool x[10]

,bestx[10]

;//可行解儲存陣列 ;和不斷更新的最優解陣列

int w[10]

,v[10];

//第t個商品重量;和第t個價值 儲存陣列

intbound_func

(int i)

//計算價值上界

return rp+cp;

//返回當第t個商品不裝時,返回前t個商品(不包括第t個)的總價值+剩餘的全部商品價值

}//回溯函式

void

func

(int t)

//t:二叉樹層數

bestp = cp;

//將當前最優解總價值cp傳給bestp以儲存記錄

return;}

//判斷條件

if(cw+w[t]

<=w)

//約束條件:先判斷加入第t個商品後是否超出總容量w

/*限界函式:提高回溯效率,優化減少不必要的分支搜尋

必須判斷當第t個商品不裝時,假定剩下的商品全部裝入,判斷cp+rp

是否"大於"之前的可行解的價值,如果不大於,則沒有必要繼續向下搜尋則回溯

以減少不必要的浪費搜尋.*/if(

bound_func

(t+1

)>bestp)

}void

in_func()

}void

put_func()

//輸出函式

cout<

//相當於回車

}main()

結果:

01揹包問題(回溯演算法實現)

問題描述 有n 件物品和乙個容量為c 的揹包。第i件物品的價值是v i 重量是w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。今天下午的演算法複習課,老師提的各種演算法經典問題時,出現頻率就是01揹包問題了!動態規劃 回溯法 分支限界法,在...

回溯演算法 01揹包問題 Java實現

回溯演算法也叫試探法,通俗的將就是乙個方向的路一直往前走,能走則走,不能走則退回來換乙個方向再試。一般的實現步驟是 針對乙個問題定 的空間,至少包含問題的乙個最優解 用易於搜尋的解空間結構,使得能用回溯方法搜尋整個解空間 以深度優先的方式搜尋整個解空間,並在搜尋過程中通過剪枝函式避免無效搜尋。如上圖...

0 1揹包問題 回溯演算法 java實現

有n種可選物品1,n 放入容量為c的揹包內,使裝入的物品具有最大效益。表示n 物品個數 c 揹包容量 p1,p2,pn 個體物品效益值 w1,w2,wn 個體物品容量 0 1揹包問題的解指 物品1,n的一種放法 x1,xn的0 1賦值 使得效益值最大。假定揹包容量不足以裝入所有物品 面臨選擇 優化原...