#include
#include
#include
using
namespace std;
typedef
struct thing
;thing *things;
const
int goods =7;
//物品的數量
int max_weigth =
150;
//揹包承受的重量
int information[2]
[goods]=,
};//第一行為重量,第二行為價值
int solution[goods]
;//解空間
int best_solution[goods]
;//最優解向量
int best_value =0;
//最優解的價值
int best_weight =0;
//最優解的重量
bool
cmp(thing &t1, thing &t2)
//重定義sort
double
get_best_value
(int t,
int limit_weight)
//完全揹包問題即限界函式的引數比較}if
(i < goods && limit_weight > sum_weight)
return sum_value;
}void
iterativebacktrack
(int t,
int cv,
int cw)
//t 第幾次遞迴(從0開始), 父節點的價值 cw剩餘空間
cout <<
" weight: "
<< best_weight <<
" value :"
<< best_value << endl;
return;}
if(cw - things[t]
.weight >=0)
//約束函式
if(cv +
get_best_value
(t +
1, cw)
> best_value)
//限界函式
}int
main()
sort
(things, things + goods, cmp)
;iterativebacktrack(0
,0, max_weigth)
; vector<
int> pos;
for(
int i =
0; i < goods; i++
)sort
(pos.
begin()
, pos.
end())
; cout <<
"裝入揹包的編號: "
<< endl;
for(
int i =
0; i < pos.
size()
; i++
) cout <<
" "<< pos[i]+1
;}
回溯法解決0 1揹包問題
1.回溯法可以看作是窮舉法的一種實現方式 2.基本過程 每一步只生成解的一部分 部分解 並立即對該部分解進行評估,若有可能擴充套件成為 所求解 則繼續擴充套件,得到新的部分解,泛指嘗試其他部分解,知道窮盡所有可能.3.解空間 所有的可能的解的集合 解空間樹 將解空間組織成樹形成的樹形結構 常見的解空...
回溯法解決01揹包問題
一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 因為回溯求解的規則是 後進先出 所以要用棧來存放符合條件的解,在儲存過程中用陣列來存放各個物品的體積和價值,然後用深度優先搜尋的方式求解,最後得到符合條件的最優解並輸出。三...
回溯法解決0 1揹包問題
問題描述 有n件物品和乙個容量為 c的揹包。第 i件物品的價值是 v i 重量是 w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。回溯法 01揹包屬於找最優解問題,用回溯法需要構造解的子集樹。在搜尋狀態空間樹時,只要左子節點是可乙個可行結點...