动态规划算法-解决01揹包问题

问题描述:

    现有N个物品,其每个物品对应的重量为Wi,对应的价值为Vi (0 =< i <= N)。则对于固定承重为K的揹包来说,在这些物品中放入某些物品使得对应的总价值最大。用C[N][K]可以表示,在一个固定承重为K的揹包中放入N个物品时的最大价值。

       C[N][K] = max{C[N-1][K],C[N-1][K-X] + Vx}

       上述公式是一个递推的过程,即在承重为K的揹包中放入N个物品中的某些,使得总价值C[N][K]最大。而C[N][K]的大小取决于两种情况中的最大值。C[N-1][K]表示遍历前N-1个物品时对应的最大价值,第N个物品不放入。C[N-1][K-X] + Vx表示第N个物品放入后对应的总价值。X为第N个物品的重量,Vx为第N个物品的价值。只要用表格从一开始就存储下对应的各项数据,则在后续过程中只需要查表递推就可以得到想要的最大值。这种方法的本质就是一个递推和用空间来节省时间的过程。

       将这个问题具体化一点:对于一个固定承重为10的揹包,现在需要在4个物品中去挑选放入的物品来使得总的价值最大。这个4个物品分别为 A、价值3 重量 3 B、价值4 重量 6 C、价值5 重量 5 D、价值 7 重量 8。分别从物品编号的维度0-4和揹包容量的维度0-10去生成对应的二维表格。单元格中对应的数据即为最大价值C[i][j]。其中编号1到4分别对应A到D的物品(与顺序无关),动态规划就是在不停地填写这张表。

表格如下:《动态规划算法-解决01揹包问题》

《动态规划算法-解决01揹包问题》

《动态规划算法-解决01揹包问题》

由上表可以得出,当在4个物品中挑选物品放入固定承重为10的揹包中时,可获得的最大价值为C[4][10] = 8。

于是利用动态规划的方法便获得了该情况下对应的最大价值。

点赞