01背包+完全背包+多重背包+单调队列(代码片段)

钟钟终 钟钟终     2022-12-01     494

关键词:

01背包

代码:逆序更新

int n,m,f[105][N],dp[N];

void fun1()

    for(int i=1;i<=n;i++)   //物品i
    
        for(int j=1;j<=m;j++)   //容量j
        
            if(j<w[i])
                f[i][j]=f[i-1][j];
            else 
                f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+c[i]);
        
    
    cout<<f[n][m]<<endl;

void fun2() //逆序更新

    for(int i=1;i<=n;i++)
    
        for(int j=m;j>=w[i];j--)
            dp[j]=max(dp[j],dp[j-w[i]]+c[i]);
    

完全背包

顺序更新
代码:

void fun1()

    for(int i=1;i<=n;i++)   //物品i
    
        for(int j=1;j<=m;j++)   //容量j
        
            if(j<w[i])
                f[i][j]=f[i-1][j];
            else 
                f[i][j]=max(f[i-1][j],f[i][j-w[i]]+c[i]);
        
    
    cout<<f[n][m]<<endl;

void fun2() 

    for(int i=1;i<=n;i++)
    
        for(int j=w[i];j<=m;j++)
            dp[j]=max(dp[j],dp[j-w[i]]+c[i]);
    
    cout<<dp[m]<<endl;

多重背包

朴素实现:

int n,v[N],w[N],f[N],s[N],vv[N],ww[N];

void fun1() //多重背包  

    for(int i=1;i<=n;i++)   //物品种数
    
        for(int j=m;j>=w[i];j--)    //背包容量
        
            for(int k=0;k<=s[i]&&k*v[i]<=j;k++)
                f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
        
    

二进制优化

void fun2() //多重背包 二进制优化

    int num=1;
    for(int i=1;i<=n;i++)
    
        int v,w,s;  //体积、价值、数量
        cin>>v>>w>>s;
        for(int j=1;j<=s;j<<=1)
        
            vv[num]=j*v;
            ww[num++]=j*w;
            s-=j;
        
        if(s)
            vv[num]=s*v,ww[num++]=s*w;
    
    for(int i=1;i<num;i++)
    
        for(int j=m;j>=vv[i];j--)
            f[j]=max(f[j],f[j-vv[i]]+ww[i]);
    
    cout<<f[m]<<endl;

单调队列

int n,a[N],q[N];

void solve()

    int head=0,tail=-1;
    for(int i=1;i<=n;i++)
    
        if(head<=tail&&q[head]<i-m+1) 
            head++;
        while(head<=tail&&a[i]>=a[q[tail]]) 
            tail--;
        q[++tail]=i;
        if(i>=m) cout<<a[q[head]]<<" ";
    
    cout<<endl;

bzoj1531多重背包/单调队列(代码片段)

多重背包二进制优化终于写了一次,注意j的边界条件啊,疯狂RE#include<bits/stdc++.h>usingnamespacestd;intn,sum;constintN=205;constintC=20050;constintK=20050;constintinf=0x3f3f3f3f;intw[N*C],idx,num[N*C];intb[N],c[N];//面值个数int 查看详情

单调队列优化多重背包(代码片段)

回顾多重背包有n种物品,用大小为m的包来装,问获取的最大价值为多少。其中,第i种物品的重量,价值,个数分别为w[i],v[i],c[i].那么,若f[i][j]表示考虑前i种物品,使用j的背包可获取的最大价值,状态转移方程为for(inti=1;i<=n... 查看详情

动态规划_01背包_完全背包_多重背包_分组背包(代码片段)

目录动态规划问题结题思路:模板题链接:01背包思路:代码:完全背包思路:代码多重背包思路:代码:组合背包思路:代码:动态规划问题结题思路:模板题链接:01背包模板题完全背包... 查看详情

动态规划之背包问题-01背包+完全背包+多重背包(代码片段)

01背包有n种不同的物品,每种物品分别有各自的体积v[i],价值 w[i] 现给一个容量为V的背包,问这个背包最多可装下多少价值的物品。1for(inti=1;i<=n;i++)2for(intj=V;j>=v[i];j--)3dp[j]=max(dp[j],dp[j-v[i]]+w[i]);//dp[V]为所求完全背包0... 查看详情

背包问题专栏(01,完全,多重)(代码片段)

...的模板是套用了A.S.KirigiriKyouko的模板。请dalao见谅一、01背包有N件物品和一个容量为V的背包。第i件物品的价格(即体积,下同)是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和... 查看详情

acwing(基础)---01背包和完全背包多重背包问题(代码片段)

初始化的细节问题我们看到的求最优解的背包问题题目中,事实上有两种不太相同的问法。有的题目要求“恰好装满背包”时的最优解,有的题目则并没有要求必须把背包装满。一种区别这两种问法的实现方法是在初始化的时候... 查看详情

动态规划多重背包问题(代码片段)

说明前面已经介绍完了01背包和完全背包,今天介绍最后一种背包问题——多重背包。这个背包,听起来就很麻烦的样子。别慌,只要你理解了前面的两种背包问题,拿下多重背包简直小菜一碟。如果没有看过前两篇01背包和完... 查看详情

单调队列优化dp,多重背包

 传送门:hdu3401Trade/**************************************************************Problem:hdu3401TradeUser:youmiLanguage:C++Result:AcceptedTime:171MSMemory:17368K*********************************** 查看详情

单调队列优化多重背包

  记得有一个经典的问题:  有一个容量为$V$的背包,和$n$种物品。第$i$种物品的重量为$w_{i}$,价值为$v_{i}$,数量为$c_{i}$。问背包中装的物品的最大价值和为多少。Subtask1$1leqslantnleqslant100,1leqslantVleqslant1000,1leqslantc_{i}leqslan... 查看详情

动态规划问题3--多重背包(代码片段)

多重背包问题描述及其代码在01背包的基础上,01背包是每个物品有一个,所以只能放入一次,此时我们再加入一个物品个数的数组s,表示每个物品的个数,多重背包介于01背包和完全背包中间,加入了判断物品个数的一个维度,... 查看详情

动态规划问题3--多重背包(代码片段)

多重背包问题描述及其代码在01背包的基础上,01背包是每个物品有一个,所以只能放入一次,此时我们再加入一个物品个数的数组s,表示每个物品的个数,多重背包介于01背包和完全背包中间,加入了判断物品个数的一个维度,... 查看详情

单调队列优化多重背包

朴素的多重背包算法为[f[i][j]=max(f[i-1][j-kv_i]+kw_i)(kv_ilej,klelim[i])?]时间复杂度为(O(Vsumlim[]))。先枚举i。设(d=lfloorfracjlim[i]floor),(r=j-lim[i]cdotd)。则上述转移可改写为[f[i][j]=max(f[i-1][r+kv_i]+(d-k 查看详情

单调队列优化多重背包

http://codevs.cn/problem/5429/ 把背包体积按模物品体积分类在每个剩余类中使用单调队列 具体点就是设物品体积为v,价值为w,现在要计算体积模v=0时的价值设f[i][j]表示前i个物品,体积为j时的最大价值f[i][5v]=max{f[i-1][4v]+w,f[i-1... 查看详情

01背包完全背包多重背包分组背包总结

文章目录​​一、01背包问题​​​​二、完全背包问题​​​​三、多重背包问题​​​​四、分组背包​​一、01背包问题n个物品,每个物品的重量是,价值是,背包的容量是若每个物品最多只能装一个,且不能超过背包容... 查看详情

背包问题(01背包,完全背包,多重背包)

...http://www.cnblogs.com/daoluanxiaozi/archive/2012/05/06/2486105.html 背包问题,经典有背包九讲。01背包 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些... 查看详情

01背包,完全背包,多重背包,混合背包

详见大牛背包九讲(下载地址:http://pan.baidu.com/s/1b9edXW)1//Class->物品种类,val->价值,room->所占空间,num->物品数量,Room->背包容量23#include<stdio.h>4constintmaxn=1e6;56intbag[maxn];7intRoom;89voidzero_one_bag( 查看详情

01背包完全背包多重背包

参考(都有些错误):https://github.com/guanjunjian/Interview-Summary/blob/master/notes/algorithms/%E7%BB%8F%E5%85%B8%E7%AE%97%E6%B3%95/01%E8%83%8C%E5%8C%85.mdhttps://blog.csdn.net/na_beginning/article/details/6 查看详情

多重背包单调队列优化

for(inti=1;i<=n;++i){Ni=Num[i];Vi=V[i];Wi=W[i];for(intj=0;j<Vi;++j){Head1=Tail1=0;Head2=Tail2=0;Cnt=0;for(intk=j;k<=m;k+=Vi){if(Tail1-Head1==Ni+1){if(Q2[Head2+1]==Q1[Head1+1])++Head2;++Head1; 查看详情