其他分享
首页 > 其他分享> > 多重背包问题的二进制优化

多重背包问题的二进制优化

作者:互联网

二进制优化代码比单调队列优化代码更清晰好写。

可以将一维优化成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