zoukankan      html  css  js  c++  java
  • 多重背包(二进制拆分法)

    众所周知,从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;
                    }
                }
            }
  • 相关阅读:
    弹性盒模型的实际应用
    大图滚动--这是精髓实例
    三级联动
    sql
    jsp2
    marquee
    人机五子棋(AI算法有瑕疵)
    Jsp1
    倒计时
    时间
  • 原文地址:https://www.cnblogs.com/wmj6/p/10389796.html
Copyright © 2011-2022 走看看