E13 背包DP 多重背包 单调队列优化
视频链接:E13 背包DP 多重背包 单调队列优化——信息学奥赛算法_哔哩哔哩_bilibili
// 单调队列 O(n*W) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=40005; int n,W,w,v,m,q[N]; int f[N],g[N]; int main(){ scanf("%d%d",&n,&W); //种类n,容量W while(n--){ memcpy(g,f,sizeof(f)); //f备份 scanf("%d%d%d",&v,&w,&m); //价值,重量,数量 for(int j=0;j<w;j++){ //0,1,2...w-1个类 int h=1,t=0; for(int k=j;k<=W;k+=w){ //0,w,2w,3w... if(h<=t && q[h]<k-m*w) h++; //[k-m*w...k-w],k while(h<=t && g[k]>=g[q[t]]+(k-q[t])/w*v) t--; //q[t]...k q[++t]=k; f[k]=g[q[h]]+(k-q[h])/w*v; //q[h]...k } } } printf("%d\n",f[W]); }
// 单调队列 O(n*W) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=40005; int n,W,w,v,m,q[N]; int f[N],g[N]; int main(){ scanf("%d%d",&n,&W); //种类n,容量W while(n--){ memcpy(g,f,sizeof(f)); //f备份 scanf("%d%d%d",&v,&w,&m); //价值,重量,数量 for(int j=0;j<w;j++){ //0,1,2...w-1个类 int h=1,t=0; for(int k=j;k<=W;k+=w){ //0,w,2w,3w... while(h<=t && g[k]>=g[q[t]]+(k-q[t])/w*v) t--; //q[t]...k q[++t]=k; if(h<=t && q[h]<k-m*w) h++; //[k-m*w...k-w],k f[k]=g[q[h]]+(k-q[h])/w*v; //q[h]...k } } } printf("%d\n",f[W]); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!