博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回溯法---->背包问题
阅读量:7067 次
发布时间:2019-06-28

本文共 1135 字,大约阅读时间需要 3 分钟。

背包问题

给定n中物品和一个容量为c的背包,物品i的重量为Wi,其价值为Vi,0-1背包问题是如何选择装入背包的物品(物品不可分割),使得装入背包的物品的价值为最大。

限界函数

procedure  BOUND( p , w, k , M)

∥p为当前效益总量; w  为当前背包重量; k 为上次去掉的物品; M  为背包容量; 返回一个新效益值∥

global  n , P( 1∶n ) ,W( 1∶n)

integer  k , i ; real b , c , p , w, M

b←p;  c←w

for  i←k +  1 to n do

c←c +  W( i )

if  c < M then b←b + P( i )

else  return ( b + (1 - ( c - M)/ W( i) ) * P( i ) )

endif

repeat

return  ( b)

end  BOUND

背包问题的回溯法求解

procedure BKNAP1( M, n ,W,  P, fw , fp , X)

∥M 是背包容量。有n 种物品, 其重量与效益分别存在数组W(1∶n) 和P(1∶n) 中; P(i)/W(i)≥P(i+1)/W(i+ 1)。fw 是背包的最后重量, fp 是背包取得的最大效益。X(1∶n) 中每个元素取0或1值。若物品k 没放入背包, 则X(k)=0 ;否则X(k)=1

   integer n , k , Y(1∶n) , i , X(1∶n) ; real M,W( 1∶n) , P(1∶n) , fw , fp , cw , cp;

   cw←cp←0 ; k←1; fp← -1 ∥cw 是背包当前重量;cp 是背包当前取得的效益值∥

   loop

   while k≤ n and cw + W(k) ≤M do ∥将物品k 放入背包∥

   cw←cw + W(k) ; cp←cp + P(k) ;Y(k) ←1; k←  k + 1

   repeat

   if k > n then fp←cp ; fw←cw;k←n;X←Y ∥修改解∥

   else Y( k)←0 ∥超出M, 物品K 不适合∥

   endif

   while BOUND( cp、cw, k , M) ≤fp do ∥上面置了fp 后,BOUND = fp∥

   while k≠0 and Y( k)≠1 do

   k←k - 1 ∥找最后放入背包的物品∥

   repeat

   if k = 0 then return endif ∥算法在此处结束∥

   Y( k) ←0; cw←cw - W( k) ; cp←cp - P( k) ∥移掉第k 项∥

   repeat

   k←k + 1

  repeat

   end BKNAP1

 

转载地址:http://nhtll.baihongyu.com/

你可能感兴趣的文章
appium简明教程(1)——appium和它的哲学世界
查看>>
linux下c/c++ IDE开发工具介绍
查看>>
从头说catalan数及笔试面试里那些相关的问题 (转)
查看>>
JavaScript高级程序设计学习笔记--事件
查看>>
完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三
查看>>
eclipse,myeclipse开发环境下,maven远程部署到tomcat7服务器(图文)
查看>>
atitit.hbnt orm db 新新增更新最佳实践o7
查看>>
分割流 SequenceInputStream (转)
查看>>
Android成长之路-LayoutInflater和inflate的用法
查看>>
ffmpeg中的时间
查看>>
Microsoft Visual Studio Ultimate 2013 with Update 3 CN+EN
查看>>
从数字油田的关键问题说开去
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
百度面试-网页搜索部
查看>>
HDU 3060 多边形面积并
查看>>
Map.EntrySet的使用方法
查看>>
【一】仿微信飞机大战cocos2d-x3.0rc1
查看>>
JavaScript 之 最佳位置选择
查看>>
使用TCMalloc优化OpenResty
查看>>
(HLS播放器之中的一个)HLS协议之M3U8解析
查看>>