演算法實驗 回溯法求解0 1揹包問題

2021-10-02 15:38:13 字數 2523 閱讀 7910

通過剪枝和衝突,走遍所有可能的選擇,最終得到最優解

1、每個節點有兩種選擇方法,依次對所有可能的方法進行遍歷

2、在遍歷的過程中通過設定一全域性變數用來比較所有的解法的結果,最終得到最優解

lagestv=

0bestx=[1

,2]def

jianzhi

(i,n,c,w,ww)

:if i>=n:

return

0 mi=w[i]

for a in

range

(i,n)

:if mi>w[a]

: mi=w[a]

if mi>

(c-ww)

:return

0else

:return

1def

huisu

(i,n,c,w,v,x,ww,vv)

:if i!=n and jianzhi(i-

1,n-

1,c,w,ww)

:if ww+w[i-1]

<=c:

huisu(i+

1,n,c,w,v,x,ww+w[i-1]

,vv+v[i-1]

) x.pop(

) huisu(i+

1,n,c,w,v,x,ww,vv)

else

: huisu(i+

1,n,c,w,v,x,ww,vv)

else

:global lagestv,bestx

if lagestvlagestv=vv

bestx=

list

(x)第乙個為剪枝函式,第二個為回溯遞迴函式

通過**可以看到其時間複雜度為n*logn

import time

lagestv=

0bestx=[1

,2]def

jianzhi

(i,n,c,w,ww)

:if i>=n:

return

0 mi=w[i]

for a in

range

(i,n)

:if mi>w[a]

: mi=w[a]

if mi>

(c-ww)

:return

0else

:return

1def

huisu

(i,n,c,w,v,x,ww,vv)

:if i!=n and jianzhi(i-

1,n-

1,c,w,ww)

:if ww+w[i-1]

<=c:

huisu(i+

1,n,c,w,v,x,ww+w[i-1]

,vv+v[i-1]

) x.pop(

) huisu(i+

1,n,c,w,v,x,ww,vv)

else

: huisu(i+

1,n,c,w,v,x,ww,vv)

else

:global lagestv,bestx

if lagestvlagestv=vv

bestx=

list

(x)if i==45:

dd=0# 主程式

if __name__ ==

'__main__'

:#inpu=open('input2.txt','r')

#n=int(inpu.readline())

n =int(

input

('請輸入元素個數:'))

#c=int(inpu.readline())

c =int(

input

('請輸入揹包容量:'))

#str_in=inpu.readline()

str_in=

input

('請輸入各個元素的重量\n'

) w=

[int

(n)for n in str_in.split()]

#str_in=inpu.readline()

str_in=

input

('請輸入各個元素的價值\n'

) v=

[int

(n)for n in str_in.split()]

x=start1=time.clock(

) huisu(

1,n+

1,c,w,v,x,0,

0)end1=time.clock(

)print

(str

((end1-start1)

*1000)+

'ms'

)print

(lagestv)

print

(bestx)

回溯法求解01揹包問題

在前面文章我們使用動態規劃求解了揹包問題,時間複雜度是o cn 當我們的c的值非常大的時候,說消耗的時間也是非常大的!接下來我們就使用回溯法來求解這個問題,其時間複雜度為o n2n 這個結果當我們的c的值是小於2n 的時候,該演算法所需的時間是小於動態規劃的!既然使用了回溯法,我們就的構造解析樹,因...

回溯法求解0 1揹包問題

include using namespace std struct dot void getvalue int weight,int value void calculate int weight,int value else while deep 6 else int main 選擇第1個 當前...

0 1揹包問題 回溯法求解

0 1揹包問題 物品總數n,每個物品的體積w i 價值v i 給定揹包的總容量w,求放入揹包中物品的最大價值。用回溯法對0 1揹包問題進行求解,具體思路是 1.使用解空間進行標記每個物品的放入情況,即要建立乙個陣列進行儲存其是否放入,可使用 bool x i 進行標識 2.回溯法第一感覺上是窮舉所有...