动态规划(dynamic programming)[正在完善

动态规划的意义之类的看dailao

百度上的动态规划 注意 阶段 状态 决策 等词的意思 以及动态转移方程

01背包

     有n件物品每种物品的重量和价格给了 已知背包的容量求背包中能装得最大价值

      dp[i][v]=max(dp[i-1][v],dp[i-1][v-v[i]]+w[i]);

     i为第几个物品 v是背包容量   相当于每个和上一个物品相同体积的背包以及加上这个物品的价值和背包剩下空间的上一个物品比较大小选这两个中大的赋给dp[i][v],其中在你这个物品体积之前的和上一行一样;

     优化 :

      1  你把这么做的过程写出来后会发现  我们所用的比较其实就只有现在操作的一行和上一行  所以我们可以把二位数组优化为两个一为维数组来存   

      2  这时候  如果用一维数组会更好    当我们只记录一行的时候  我们要从后往前更新 因为如果我们从前往后更新的话   当我们在更新后面的时候 后面的用的就是你之前更新过的值  就有可能会出错(可以理解为只有一个东西可能会变成选多个东西

     注意 :当条件中只说让你找最大的价值dp全部赋0就行了  当条件中说让你找背包恰好装满时的最大价值 就是把dp[0]赋成0其余地方赋为负无穷(-0x3f3f3f3f)   因为当背包体积为0时恰好装满就是0

完全背包

      有k种物品每种物品有无穷件每种东西的价值和重量知道    你知道背包容量求背包中能装得最大价值

      可以把完全背包转化为01背包  用背包容量处以这个物品的体积就能求最多能装多少个这个物品

     用二进制优化  将一种东西用二进制表示  例如 7  111 可以用1 2 4 表示7以内的数 第一次减1第二次减2 ....最后数量不够减了就将剩下的单独进行一次01背包   

       用一维数组优化  之前01背包是反着循环的现在正着循环   就变成了k

多重背包

       有n件物品每种物品的重量和价格给了 每件物品有一定的数量  已知背包的容量求背包中能装得最大价值

     如果数量*体积大于背包容量  完全背包

    如果数量*体积小于背包容量  01背包

猜你喜欢

转载自blog.csdn.net/qq_41886199/article/details/81114907