前言
本身我自己dp学的就不是很好,现在刷几道题有关dp的,每道题总结一下做题的思路。
P2871 USACO07DEC]手链Charm Bracelet
这是一道01背包题,很基础, dp[j]表示的是背包里已经有i的重量,所能拿到的最大价值, 考虑枚举每一个物品, 考虑拿或者不拿,枚举最大重量到本物体的重量, 如果拿的话, 那么当前的重量所能拿到的最大值是dp[ j - w[ i ] + c[ i ], 如果不拿的情况下, 当前的最大重量为dp[ j ], 在这两个之中取最大值就好了, 答案就是dp数组中存的最大的那一个。
为什么第二重循环枚举重量要从后往前枚举:
当j值从 w[j] 枚举到 V 的话, 如果dp[ j - c[ i ] ]被更新掉的话, 那么如果 V 是c[ i ]的倍数或者更大的话, 那么dp[ j - c[ i ] ]将会被转移两次。所以这就成了完全背包了, 但是如果从后往前更新的话就会避免dp[ j ]重复计算的事情发生。