本人弱鸡,开始学dp时,对背包问题有许多疑惑,听了讲座却还不是很懂,看了许多博客的讲解也觉得理解的不是很透彻,就背了代码直接过了。现在查阅了一些资料,自己想了想,终于开始明悟,现在把我想到的记录下来,希望能为有相同境遇的萌新提供一些思路。
我们先来了解01背包的性质,01是指物品在背包中的状态,也就是说,现在有一个容积为 V 的背包,有 n 件物品,每件物品只有一件,他们的体积为 v[i] ,价值为 w[i], 0 就表示 背包里不装这件物品,1反之。因为他们的数量唯一,所以 只需要讨论在或不在,不需要讨论数量。
求背包里物品最大价值的滚动优化过的实现代码如下
for(int i=1;i<=n;i++)
for(int j =v ;j>=v[i];j--)
f[j] = max(f[j] , f[j - v[i]]+w[i]);
看到这里,我们不禁产生了疑问:为什么体积遍历要逆序进行?
不妨手写一组数据
<