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