使用回溯法解決0 1揹包問題

2021-10-13 21:49:28 字數 1912 閱讀 3788

使用迭代進行樹的搜尋,含有限界函式在每次迭代前進行判斷。

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.解空間 所有的可能的解的集合 解空間樹 將解空間組織成樹形成的樹形結構 常見的解空...