这里给大家推荐一个好的文章 http://www.hawstein.com/posts/dp-knapsack.html
关于0-1背包问题,也许很多人看过《背包问题九讲》,里面主要是要理解那个背包问题的公式
![](https://images0.cnblogs.com/blog/751746/201507/222006342244607.png)
公式(1)当然是关键,其实我们很直观地从(1)中看出它的物理含义。F[i,v]这个二维数组代表的意思是,在背包容量为v,我们有从1到 i 号的物品供你选择,那
么你能在背包容量为v的前提下,所能获得的最大价值是F[i,v】,理解这个是问题中关键的关键。
对于这个题目:
![](https://images0.cnblogs.com/blog/751746/201507/222006347871035.jpg)
我们采用伪代码:
![](https://images0.cnblogs.com/blog/751746/201507/222006352561192.png)
用实际的数字来分析问题:
![](https://images0.cnblogs.com/blog/751746/201507/222006358186619.png)
上表是在运行过程中F【i,v】数组的情况。其实这个原理很简单,无非就是对于第i个商品,你选或者不选 。
![](https://images0.cnblogs.com/blog/751746/201507/222006363495991.png)
还是这个公式,对于F[i,v],也就是在容是为v的情况下,我们选或者不选第i个商品,如果我们不选第i个商品,那么也就是说在背包容量为v的情况下我们的价值和
F[i-1,v]是一样的啦,这个意思是,我们不先第i个商品,问题没有进化,还是和原来一样(当然在背包的容量相等情况下),但是如果我们选第i个商品,那么就不
同了,我们的背包容量得先减Ci 也就是第i个商品的体积啦 。当然我们在牺牲背包的容量的情况下,那么价值也得提升Wi。
当然我们是在这两者间选那个价值最大的。