日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

01背包问题:回溯法和限界分支、递归和迭代方式

發(fā)布時間:2024/9/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 01背包问题:回溯法和限界分支、递归和迭代方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

01背包問題

遞歸方式模板:

void backtrack(int t){ if(t > n) output(x); else{ for(int i = f(n,t); i <= g(n,t);i++){ x[t] = h(i); if(constraint(t) && bound(t)) backtrack(t+1); } } }

遞歸實現(xiàn):分成3個部分,為了使用限界函數(shù),需要把數(shù)據(jù)降序排序,限界函數(shù),以及回溯函數(shù)。

def pack_01_back_prune(N,V,C,W):BestResult = [False]*NSelected = [False]*(N)BestValue = [0]CurCost = [0]CurValue = [0]order = [i for i in range(N)]perp = [0]*N# sorted by value per weightdef sort_group(C,W,O):perp = [0]*Nfor i in range(N):perp[i] = W[i]/C[i]for i in range(N-1):for j in range(i+1,N):if perp[i] < perp[j]:temp = perp[i]perp[i] = perp[j]perp[j] = temptemp = O[i]O[i] = O[j]O[j] = temptemp = C[i]C[i] = C[j]C[j] = temptemp = W[i]W[i] = W[j]W[j] = temp return perp,C,W,O # 計算上界函數(shù),功能為剪枝 # 判斷當(dāng)前背包的總價值cp+剩余容量可容納的最大價值<=當(dāng)前最優(yōu)價值def bound(depth):left_weight = V - CurCost[0]b = CurValue[0] while depth < N and C[depth] <= left_weight:left_weight -=C[depth]b += W[depth]depth +=1if depth < N:b += perp[depth] * left_weightreturn bdef backtracking(depth):if depth > N-1:if CurValue[0] > BestValue[0]:BestValue[0] = CurValue[0] BestResult[:] = Selected[:]else: # 如若左子節(jié)點可行,則直接搜索左子樹; # 對于右子樹,先計算上界函數(shù),以判斷是否將其減去if CurCost[0] + C[depth] <= V :# and bound(depth+1) > BestValue[0]:Selected[depth] = TrueCurCost[0] += C[depth]CurValue[0] += W[depth]# nextbacktracking(depth+1)# undoCurCost[0] -= C[depth]CurValue[0] -= W[depth] # 如若符合條件則搜索右子樹 if bound(depth+1) > BestValue[0]:Selected[depth] = Falsebacktracking(depth+1)perp,C,W,order = sort_group(C,W,order)backtracking(0)# 把結(jié)果恢復(fù)成原來順序decode_BestResult =[False]*Nfor i in range(N):if BestResult[i]:decode_BestResult[order[i]] = Truereturn decode_BestResult,BestValue

迭代方式,順序執(zhí)行,注意一點,就是不滿足限界函數(shù)時,需要提前進入回溯

#%%def pack_01_back_prune_iteration(N,V,C,W):BestResult = [False]*NSelected = [False]*(N)BestValue = [0]CurCost = [0]CurValue = [0]order = [i for i in range(N)]perp = [0]*N# sorted by value per weightdef sort_group(C,W,O):perp = [0]*Nfor i in range(N):perp[i] = W[i]/C[i]for i in range(N-1):for j in range(i+1,N):if perp[i] < perp[j]:temp = perp[i]perp[i] = perp[j]perp[j] = temptemp = O[i]O[i] = O[j]O[j] = temptemp = C[i]C[i] = C[j]C[j] = temptemp = W[i]W[i] = W[j]W[j] = temp return perp,C,W,O # 計算上界函數(shù),功能為剪枝 # 判斷當(dāng)前背包的總價值cp+剩余容量可容納的最大價值<=當(dāng)前最優(yōu)價值def bound(depth):left_weight = V - CurCost[0]b = CurValue[0] while depth < N and C[depth] <= left_weight:left_weight -=C[depth]b += W[depth]depth +=1if depth < N:b += perp[depth] * left_weightreturn bdef backtracking_iteration(depth):while True:if depth < N:# 進入1的分支if CurCost[0] + C[depth] <= V and bound(depth+1) > BestValue[0]:Selected[depth] = TrueCurCost[0] += C[depth]CurValue[0] += W[depth]# 進入0的分支elif bound(depth+1) > BestValue[0]:Selected[depth] = False# 不滿足限界函數(shù),回溯 else:while depth >= 0 and not Selected[depth]:depth -=1if depth < 0:breakelse:Selected[depth] =FalseCurCost[0] -= C[depth]CurValue[0] -= W[depth] else:if CurValue[0] > BestValue[0]:BestValue[0] = CurValue[0] BestResult[:] = Selected[:]# 到底部回溯,這時候,depth已經(jīng)穿了depth -=1while depth >= 0 and not Selected[depth]:depth -=1if depth < 0:breakelse:Selected[depth] =FalseCurCost[0] -= C[depth]CurValue[0] -= W[depth] depth +=1perp,C,W,order = sort_group(C,W,order)backtracking_iteration(0)decode_BestResult =[False]*Nfor i in range(N):if BestResult[i]:decode_BestResult[order[i]] = Truereturn decode_BestResult,BestValue

輸出結(jié)果

#%% N = 8 V = 30 C = [11,2,3,9,13,6,15,7,19] W = [5.0,2.0,5.0,7.0,5.0,11.0,6.0,14.0]#print pack_01_back(N,V,C,W) #print pack_01_back_iteration(N,V,C,W) #print pack_01_back_iteration2(N,V,C,W) print pack_01_back_prune(N,V,C,W) print pack_01_back_prune_iteration(N,V,C,W)runfile('/root/test/back_tracking.py', wdir='/root/test') ([False, True, True, True, False, True, False, True], [39.0])runfile('/root/test/back_tracking.py', wdir='/root/test') ([False, True, True, True, False, True, False, True], [39.0])

還有一種分支限界的思路,上界函數(shù)為:CurValue + rest <= BestValue:

# 這種解法注意回溯函數(shù)一致性,思路比較清晰:滿足剪枝條件就回溯:CurValue + rest <= BestValue def pack_01_back_iteration3(N,V,C,W):depth = 0BestResult = [False]*NSelected = [False]*(N)BestValue = 0CurCost = 0CurValue = 0 rest = 0for i in range(N):rest += W[i]while True:while depth < N and CurCost + C[depth] <= V:rest -=W[depth]Selected[depth] = TrueCurCost += C[depth]CurValue += W[depth]depth +=1if depth >= N:BestValue = CurValue BestResult[:] = Selected[:]else:rest -=W[depth]Selected[depth] =Falsedepth +=1while CurValue + rest <= BestValue:depth -=1while depth >=0 and not Selected[depth]:rest +=W[depth]depth -=1if depth < 0:return BestResult,BestValueelse:Selected[depth] =FalseCurCost -= C[depth]CurValue -= W[depth]depth +=1N = 8 V = 30 C = [11,2,3,9,13,6,15,7,19] W = [5.0,2.0,5.0,7.0,5.0,11.0,6.0,14.0]print pack_01_back_iteration3(N,V,C,W)([False, True, True, True, False, True, False, True], 39.0)

總結(jié)

以上是生活随笔為你收集整理的01背包问题:回溯法和限界分支、递归和迭代方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 四虎影视大全 | 国产av无毛 | 嫩草视屏 | 亚洲精品影院在线 | 国产又粗又猛又黄又爽无遮挡 | 日韩一区二区三区在线观看视频 | 天堂无乱码 | 亚洲啊v在线| 日本一本久草 | 亚洲色图第一区 | 色射网 | 精品一区二区久久久久久久网站 | 欧美亚洲高清 | 欧美狂猛xxxxx乱大交3 | 91免费高清 | 久久精品99久久久久久 | 双性尿奴穿贞c带憋尿 | 成人免费毛片嘿嘿连载 | 熟妇高潮一区二区三区在线播放 | 中文字幕无线码 | 久久sese| 成人av播放 | 蜜桃一区二区 | 精品国产a线一区二区三区东京热 | 精品成在人线av无码免费看 | 欧美裸体视频 | 少妇性l交大片免费观看 | 日韩电影中文字幕在线观看 | 黄色片aaaa| 欧美日韩一区二区三区在线播放 | 精品久久久噜噜噜久久久 | 男女羞羞的视频 | 亚洲福利视频在线 | 丝袜老师让我了一夜网站 | 99热这里只有精 | aaaaaav| 影音先锋二区 | 福利片在线播放 | free性娇小hd第一次 | 天堂av免费观看 | 色老板精品凹凸在线视频观看 | av鲁丝一区鲁丝二区鲁丝三区 | 午夜不卡在线观看 | 日韩人妻一区二区三区 | 久久香蕉网 | 久久欲| 中文字幕一区二区三区免费视频 | aaa影院 | 欧美在线视频一区二区 | 国产jzjzjz丝袜老师水多 | 亚洲国产mv| 午夜偷拍福利 | 少妇av在线 | 色婷婷亚洲一区二区三区 | 日日噜| 欧美福利电影 | 黄瓜视频成人 | 中文字幕人妻一区二区三区 | 天天操天天玩 | 中文字幕在线观看线人 | 国产精品一区一区三区 | 亚洲精品乱码久久久久久久久久久久 | 久久精品www人人爽人人 | 狠狠干在线观看 | 91国产免费观看 | av网站久久 | 日本极品丰满ⅹxxxhd | 亚洲黄色中文字幕 | 瑟瑟视频网站 | 韩日av片 | 91射区| 亚洲一区有码 | 国产黑丝一区 | 狠狠狠| 国产欧美三级 | 国产精品porn | 日韩av少妇 | 日韩欧美国产网站 | 精品亚洲乱码一区二区 | 神马久久午夜 | 国产一区二区小视频 | 小视频在线播放 | 三上悠亚中文字幕在线播放 | 明日叶三叶| 久草成人 | 中文字幕乱码中文字幕 | 欧美啪啪小视频 | 三级视频国产 | 中文字幕丰满人伦在线 | 韩国一区二区三区视频 | 国产字幕在线观看 | 婷婷丁香在线 | 超碰狠狠干 | 亚洲第三区 | 日韩色 | 久久精品国产亚洲av成人 | 天天色官网| 中国免费黄色片 | 国产精品成av人在线视午夜片 |