使用迭代進行樹的搜尋,含有限界函式在每次迭代前進行判斷。
result_list =
# 執行次數
times =
0# 判斷是否可行
defworkable
(result:
list
, weight_list:
list
, bag:
int)
: weight =
0for index, value in
enumerate
(result)
:# result中為1的項才能被計算
if value ==1:
weight += weight_list[index]
if weight > bag:
return
false
return
true
# 求出最優解
defget_max_value
(result_list:
list
, value_list:
list):
value_result =
for result in result_list:
tmp_value =
0for index, value in
enumerate
(result)
:if value ==1:
tmp_value += value_list[index]
# 求出最大值
max_value =
max(value_result)
# 求出最大值對應取法
max_index = value_result.index(max_value)
print
(result_list[max_index]
)return
max(value_result)
defmain
(weight_list, value_list, bag, result)
:global times
times +=
1# 當前物品裝包
result1 = result.copy()1
)# 判斷是否可行
if workable(result1, weight_list, bag)
:print
(result1)
# 如果完成裝包,則返回,且記錄
iflen
(result1)
==len
(weight_list)
:return
main(weight_list, value_list, bag, result1)
# 當前物品不裝包
result0 = result.copy()0
)# 判斷是否可行
if workable(result0, weight_list, bag)
:print
(result0)
# 如果完成裝包,則返回,且記錄
iflen
(result0)
==len
(weight_list)
:return
main(weight_list, value_list, bag, result0)
if __name__ ==
'__main__'
: w =[8
,6,4
,3] v =[12
,11,9
,8] b =
13 main(w, v, b,
)print
(get_max_value(result_list, v)
)print
(times)
0 1揹包問題使用回溯法
對於0 1 揹包問題可以用動態規劃演算法解決,這裡先不說這種方法。只介紹回溯法,0 1揹包問題的回溯法解決的解空間是子集樹。下面給出最簡潔的 比較方便理解呢 include includeusing namespace std int n,c,bestp 物品的個數,揹包的容量,最大價值 int p...
使用回溯演算法解決 0 1 揹包問題
對於 0 1 揹包問題,我們最高效的方法是使用動態規劃來解決,但其實我們使用回溯演算法也可以解決0 1揹包問題 問題描述 我們有乙個揹包,揹包可承載的重量是wkg。現在我們有n個物品,每個物品的重量不等,並且不可分割,我們現在期待選擇幾件物品裝載到揹包中,在不超過揹包重量的前提下如何讓揹包中物品的總...
回溯法解決0 1揹包問題
1.回溯法可以看作是窮舉法的一種實現方式 2.基本過程 每一步只生成解的一部分 部分解 並立即對該部分解進行評估,若有可能擴充套件成為 所求解 則繼續擴充套件,得到新的部分解,泛指嘗試其他部分解,知道窮盡所有可能.3.解空間 所有的可能的解的集合 解空間樹 將解空間組織成樹形成的樹形結構 常見的解空...