01背包_顺序枚举和逆序枚举的问题_一维数组
2021-02-12 07:17
标签:put hide code 01背包 mamicode 重复 play 更新 width 逆序枚举和顺序枚举差异主要在一维数组实现的时候出现 方程: dp[j]=max(dp[j],dp[j-w[i]]+v[i]); 测试样例: 3 5 3 5 2 6 4 10 逆序结果: 11 顺序结果: 12 12这个错误的数据是怎么来的? 利用check,打印每次枚举后的结果, 代码如下 对于放入第2个物品,容量为3的枚举,dp[3]= 6, 6= dp[3-2]+6 对于放入第2个物品,容量为4的枚举,dp[4]= 12, 12= dp[4-2]+6 在第4次枚举的时候发现问题, 原因在于dp[4]=dp[j]=max(dp[j],dp[j-w[i]]+v[i]); dp[4]=dp[2]+6 = 6+6 然鹅,dp[2]已经更新过,通过装入物品2, 此时dp[2]的值是容量为2的时候的最大值, 在这个过程里, 第2个背包被使用了两次, 重复枚举就是利用先更新容量小的背包实现的 而dp[5]则是直接继承了dp[4] 每次都利用之前的最大值,并且每个背包都放进去试一试, 可以继承已经更新过的--前驱背包的--"最大价值", 也就可以重复无限次, 这样枚举出来的结果是完全背包的最大价值 ============//============= 而逆序枚举呢? 和顺序枚举不一样的地方从放入第2个物品开始, 逆序 dp[5]=dp[5-2]+6=dp[3]+6, 一样用的是之前更新过的最大值, 但是区别在于, 之前更新过的dp[3], 并没有被第2个物品放入过, 也就是说没有被枚举更新过, 也就是说不存在重复更新, 同理, dp[4] =dp[4-2]+6=dp[2]+6; 此时dp[2]=0, 还没有被更新过,还没有尝试放入第2个物品过, 不存在: 容量小的背包在容量大的背包被更新之前就更新过 结论: 顺序枚举的结果是可取无限次物品的结果, 逆序结果得到的是每种物品只取一次的结果 01背包_顺序枚举和逆序枚举的问题_一维数组 标签:put hide code 01背包 mamicode 重复 play 更新 width 原文地址:https://www.cnblogs.com/KID-yln/p/12731289.html 1 #include
文章标题:01背包_顺序枚举和逆序枚举的问题_一维数组
文章链接:http://soscw.com/index.php/essay/54357.html