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


眾所周知,從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;
                }
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM