这周做背包问题,做了很多dp题,再做背包问题的时候发现这个好简单,现在想想一开始做dp题时的心理反应,真的发生了极大的变化。一开始接触dp题,连思路都没有,于是就在csdn中搜题然后看题解,有时有题解也看不懂代码,这时就一步一步的运行代码(在草稿纸上把每个循环的结果写出来),跟随着代码的运行理解代码所代表的意思。在草稿纸上写多重循环这简直就是太麻烦的事情了,有时后面的数还需要前面的数代入,这时就要在草稿纸上找这个数。后来发现了Excel的好处,表格已经弄好,你只需要填数值就可以了,这大大降低了找数字的时间,并且这样显得简单明了,非常易懂。从此做dp题就非常喜欢Excel,尤其是目前的背包问题,一开始就疑惑为什么放入这个物品后,背包总体积没有减去这个物品的体积,在这样的情况下代码反而是正确的。带着这样的疑惑,我用Excel跑了一遍代码,接下来就是连声惊叹,这优化的太厉害了,小于这个物品的体积,根本就装不下物品,所以不用计算,直接循环条件大于等于第i个物品的体积就可以,这样省去了很多次无用的循环。二重循环体积是递减的,这样不破坏前面的小数据,而后面的大数据还能修改。至于为什么背包总体积没有减去这个物品的体积,是因为体积是在dp【xxx】xx中减去的,每次循环都会更新dp【v】的值,而这个值又与上一次循环的dp有关,而前面dp已经是最大值了,dp【v】顺其自然也就是最大值了。这个状态转移方程真的是凝缩的精华,整道题的灵魂所在。
因为做题的积累吧,现在做背包题感觉状态转移方程可以轻易写出,一些根据背包问题改编的题,完全就是向背包上靠,仿佛背包问题的代码就是模板,遇见新的问题想一下这个模板,新的题也就能解出来了。
现在做题,自信心慢慢回升,做题成功后的喜悦感直接上头,以前是看题解·做题,做题成功的喜悦感比较小,可能觉得不是单靠自己做的,反而喜悦感没有那么强。学习到现在,觉得学习算法真的提高了编程能力,认识到了很多目前没有学到的东西,离开了学习c++的舒适区,增加了做题的数量,虽然学习算法占据了课余时间,但是提升了能力,这也是值得的。与其浪费时间放纵自己,不如多些时间提升自己!
第九周总结
![](https://img-home.csdnimg.cn/images/20240711042549.png)