先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[i][0..V]的所有值。那么,如果只用一个数组f [0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[i][v]呢?
我们会发现,在每次循环中,我们用的其实只是上面一次的数据,所以其实只需要一行来保存上面一次的数据就可以了。
但是我们注意到,在状态转移方程中,我们需要回溯前面的数据,如果我们从左往右扫描,并且同时修改数据,那我们在这次的状态转移中就会改变上次的初始位置,导致用现在的值去模拟以前的状态,就会出错,比如我们第一个物品是w=2,V=5,第二个物品是w=1,v=2
那么在状态转移方程中,如果从前往后,那么就会导致结果虚高。在考虑第二个物品的时候,我们就会发现w=2的时候最大可以为7
为了解决这种问题,我们需要从后往前回溯,这样就可以保证不改变以前状态转移方程的结果。
对于这个问题,一开始确实有点不太好入手。一堆的物品,每一个都有一定的质量和价值,我们能够装入的总重量有限制,该怎么来装使得价值最大呢?对于这n个物品,每个物品我们可能会选,也可能不选,那么我们总共就可能有2^n种组合选择方式。如果我们采用这种办法来硬算的话,则整体的时间复杂度就达到指数级别的,肯定不可行。
现在我们换一种思路。既然每一种物品都有价格和重量,我们优先挑选那些单位价格最高的是否可行呢?比如在下图中,我们有3种物品,他们的重量和价格分别是10, 20, 30 kg和60, 100, 120。