背包问题的几种解法总结

动态规划求解0-1背包问题,最重要的就是状态转换方程,如下:

状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] }

Max为什么有两部分,其实就是眼前这个东西,你放还是不放。放了,就是 f[i-1,j-Wi]+Pi( j >= Wi ),Pi为当前决策的回报,f[i-1,j-Wi]为转移到状态的回报;不放就是 f[i-1,j] ,保留之前的价值。
例子转载于http://blog.csdn.net/mu399/article/details/7722810,但在此基础上更一步说明求解过程。


先不管该题中的数据是否正确,我们只理解方法。动态规划有几个主要内容,状态,行为,状态转移以及回报。

状态:背包还可以承重多少,例子中共有10个状态。

行为:眼前的这个物品是放还是不放。就如同例子中,按e,d,c,b,a的顺序,依次决定这个东西在每个可能的承重状态下,放还是不放。

状态转移:放入该物体后,背包可承重发生变化;不放的话则不变。

回报:即背包内物体具有的价值。

迭代过程从e开始,迭代次数为物品个数,即5。每次迭代计算10个状态的总价值。最后一步计算出每个状态的最优值,过程中记录下来的行为即为最优行为。

那么至于为什么这么迭代求解出来的值为最优值呢?其实就是把问题分解成了子问题,且使得每个子问题最优。比如,第三次迭代,也就是决定c放不放的时候。状态为9,若放了c,则仅剩下3以下重量的可以放。在第2次迭代时已经保证了得到了若只能放3的最优行为,则可以计算放c后的总价值,若不放则保持之前计算的价值。max保证了每次迭代的最优。

动态规划,把一个问题划分成了多阶段决策过程,通过迭代进行求解。与分治法不同的是,很多子问题未重复求解,减小了求解次数,提高了运算效率。但难点其实就是找最优子结构。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值