本计算fv所需的上层循环中的fv的值已经被新的值覆盖掉了,故必须从大到小循环。其次是多重背包,完全可以化为01背包问题,不过是把相同价值的同种类物品看成多个价值相同的不同种类物
品,即比01背包多了一重循环,要注意的是这两层循环都要从大到小,原理和01背包类似。最后是完全背包问题,伪代码如下:
ffori1Nforv0Vfvmaxfvfvciwi这个伪代码与01背包的伪代码只有v的循环次序不同而已。为什么这样一改就可行呢?首先想想为什么01背包中要按照vV0的逆序来循环。这是因为要保证第i次循环中的状态fiv是由状态fi1vci递推而来。换句话说,这正是为了保证每件物品只选一次,保证在考虑“选入第i件物品”这件策略时,依据的是一个绝无已经选入第i件物品的子结果fi1vci。而现在完全背包的特点恰是每种物品可选无限件,所以在考虑“加选一件第i种物品”这种策略时,却正需要一个可能已选入第i种物品的子结果fivci,所以就可以并且必须采用v0V的顺序循环。这就是这个简单的程序为何成立的道理。这里我向大家推荐一下浙江大学的DD牛所写的《背包九讲》,是背包入门及提高的最为经典的资料。现在就要讲一下树型DP了,树型DP其实就是DP,只不过是建立在树模型之上的DP罢了,不过树型DP说起来虽然简单,确是DP中相当困难的一个知识点,要好好理解,多做些题才行。最后是状态压缩DP,这也是一个DP的一个难点,所谓的状态是指利用二进制或者其他进制的数来表示状态从而达到空间上压缩的目的,这一类的状态设计一般都很巧妙,而且涉及的众多位运算对于编码能力也是一个相当大的挑战,介于状态压缩DP是用记忆化搜索所谓记忆化搜索,是DP的另外一种递归的实现形式,即所谓的自顶向下来实现的,又要牵涉到搜索的知识点,建议等学习了相关
f的内容之后再回过来头来学习这个知识点。状态压缩的经典题有棋盘覆盖问题,炮兵阵地等。4搜索包括DFSBFSA
搜索也是ACM中相当重要的一个组成部分,涉及范围也是相当之广,首先是最为基础的深度优先搜索DFS,所谓的DFS,其实就是通过递归的方式枚举所有的可能从而得到我们想要的结果,而搜索中相当重要的一个技巧就是剪枝,即人为地删去一些没有必要搜索的可能,从而提高我们程序的效率,DFS的经典题有最为著名的八皇后为题,Sticks等等。其实DFS的题实在是太多了,PKU上有很多的题可以供我们练手。另外一个就是广度优先搜索BFS了,广度优先搜索r