多重背包(二进制拆分法)

Posted wmj6

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多重背包(二进制拆分法)相关的知识,希望对你有一定的参考价值。

众所周知,从2,21,...,2k-1这k个2的整数次幂中选出若干相加,可以表示出0~2k-1之前的任意整数

技术图片

所以我可以把Ci个物品分解成p+2个

即若干个2的幂次方为系数的体积(对下面的这些体积进行0/1背包)

20*Vi+...+2p*Vi+Ri*Vi  

for(int i=1;i<=n;i++){//种类数
            int temp=c[i]; int now=1;
            while(1){    //把c[i]拆解成若干个2的幂次方 
                if(temp>now){
                    temp-=now;
                    for(int j=m;j>=now*a[i];j--)
                        if(dp[j-now*a[i]])
                        dp[j]=1;
                        now*=2;
                }else{
                    for(int j=m;j>=temp*a[i];j--)
                    if(dp[j-temp*a[i]])
                        dp[j]=1;
                    break;
                }
            }
        }

 

以上是关于多重背包(二进制拆分法)的主要内容,如果未能解决你的问题,请参考以下文章

多重背包+二进制拆分 POJ1014

洛谷 1776 宝物筛选 多重背包+二进制拆分

二进制优化多重背包

二进制优化多重背包

多重背包二进制优化

AcWing 5. 多重背包问题 II(二进制优化)