首页 > 其他 > 详细

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

时间:2019-02-16 23:52:57      阅读:1090      评论:0      收藏:0      [点我收藏+]

众所周知,从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;
                }
            }
        }

 

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

原文:https://www.cnblogs.com/wmj6/p/10389796.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!