多重背包问题的二进制优化
作者:互联网
二进制优化代码比单调队列优化代码更清晰好写。
可以将一维优化成log级别。
其思想是,将数量s,1+2+4+...+s0,对1、2、4、...、s0分别打包,
则小于s的任意一个数量均可由这些打包表示出来。
这样数量为s的多重背包,可分解为这些打包的01背包。
注意,由于此时物品数量增多,必须优化dp数组的第一维。
循环时,先循环(int k=1;k<=s;k*=2),再循环(int j=V;j>=k*v;j--),然后s-=k。
最后如果剩余了s,则再循环一次。
代码如下:
for(int k=1;k<=s;k*=2) { for(int j=V;j>=k*v;j--) { dp[j]=max(dp[j],dp[j-k*v]+k*num); } s-=k; } if(s) { for(int j=V;j>=s*v;j--) { dp[j]=max(dp[j],dp[j-s*v]+s*num); } }View Code
标签:多重,背包,二进制,--,int,打包,优化,dp 来源: https://www.cnblogs.com/ydUESTC/p/16345711.html