通過剪枝和衝突,走遍所有可能的選擇,最終得到最優解
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.回溯法第一感覺上是窮舉所有...