0
点赞
收藏
分享

微信扫一扫

背包问题模板

code_balance 2022-05-01 阅读 72

01背包问题

for(int i=0;i<n;i++){                    //枚举背包物品
    for(int j=m;j>=v;j--){               //枚举背包体积
        f[j]=Math.max(f[j],f[j-v]+w)     //更新体积最大值
    }
}
                

完全背包问题

for(int i=0;i<n;i++){                    //枚举物品
    for(int j=v;j<=m;j++){                //枚举体积
        f[j]=Math.max(f[j],f[j-v]+w)        //更新最大值
    }
}

多重背包问题

for(int i=0;i<n;i++){                            //枚举物品
    for(int k=1;k<=cnt;k++){                    //枚举物品个数
        for(int j=m;j>=k*v;j--){                //枚举物品体积
            f[j]=Math.max(f[j],f[j-k*v]+k*w));
        }
    }
}

多重背包二进制优化

for(int i=0;i<n;i++){                                //枚举物品
    for(int k=1;k<=cnt;k*=2){                        //利用倍增思想进行枚举个数优化
        for(int j=m;j>=k*v;j--){
            f[j]=Math.max(f[j],f[j-k*v]+k*w);
        }
        cnt-=k;
    }
    if(cnt>0){                                        
        for(int j=m;j>=cnt*v;j--){
            f[j]=Math.max(f[j],f[j-cnt*v]+cnt*w);
        }
    }
}

分组背包问题

for(int i=0;i<s;i++){                                //枚举组数
    for(int j=m;j>=0;j--){                            //枚举体积
        for(int k=0;k<cnt[i];k++){                       //枚举组内每个物品
            if(j>=v[i][k]){
                f[j]=Math.max(f[j],f[j-v[i][k])+w[i][k]);
            }
        }
    }
}

注:当给背包开二维空间时,不在乎枚举顺序,当压缩一维空间时,01背包须从大到小枚举,如果从小到大枚举,第i层本应用第i-1层状态更新,变成了的i层空间更新,与原本不符,完全背包从小到大枚举,完全背包是用本层更新,所以需从小到大遍历

举报

相关推荐

0 条评论