码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-02-17 00:29:33      阅读:408      评论:0      收藏:0      [点我收藏+]

标签:pre   int   str   ...   分解   image   span   else   sub   

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

 

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

标签:pre   int   str   ...   分解   image   span   else   sub   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!