#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賦值 使得效益值最大。假定揹包容量不足以裝入所有物品 面臨選擇 優化原...