背包问题
从开始学DP,到现在背包问题,做题过程中遇到了很多问题,也看了很多模板,有一点比较重要,不要同memset给数组赋值赋0或-1之外的值。做题的时候有的看了题解,有的上来就会有思路,也在想什么时候自己也能看到题目就能写出动态转移方程了?大佬说没有三五十道题目不会熟悉模板,没有100道题,自己遇到任何题不一定写出动态转移方程。DP很难,很难想,很难找到时间换空间的方法,所以要通过更多的训练,还有用到了无穷大的操作0x7f7f7f7f是无穷大,>int型是4个字节 一个字节8个位 0x7f7f7f7f 是十六进制 也就是4个0x7f ,一个0x7f 转化为二进制就是 01111111 因为是int型 第一个位是符号位 ,因而在int 型中 0x7f7f7f7f也就是无穷大的意思。
但是如果两个无穷大相加,进位后变成负数,成为无穷小,所以无穷大要用0x3f3f3f3f这个值,两个值相加仍是无穷大,而自己是无穷大的一半略小点,数量级最够算得上是无穷大。紧接着是背包问题,可以说大多数问题,都可以参考状态转移方程dp[i][j]=max(dp[i-1][j-weight]+value,dp[i-1][j]),意思是第I个物品,选不选,如果选就是前i-1个物品,装满容量为V[i]-weight的背包问题,如果不选就是前i-1装满容量为V[i]的背包的问题,由此可以延伸,解决类似的问题。