回溯法解決0 1揹包問題 遞迴

2021-10-12 06:53:45 字數 1620 閱讀 8677

#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揹包屬於找最優解問題,用回溯法需要構造解的子集樹。在搜尋狀態空間樹時,只要左子節點是可乙個可行結點...