今天在这里说一下多重背包问题 对

之前一直没有怎么彻底理解

首先多重背包是什么?这里就不做过多的赘述了

朴素的多重背包的复杂度是\(O(n*m*\sum s[i])\),其中\(s[i]\)是每一件物品的数量

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

但大多数题目,这种复杂度是不能允许的

那么我们考虑优化

首先我们考虑,怎么样快速表示\(1~n\)中所有的数呢?

二进制!

打个比方\(n=6\),那么我们就只需要1 2 3就能构成所有的数

1=1
2=2
3=3
4=1+3
5=2+3
6=1+2+3

对于一个数n,我们只需要从小开始不停用n减去2的幂次方,若n大于0,则当前的二的幂次方合法,最后我们将合法的二的幂次方和最后的余数分别看成一个新的物品去做背包,就能表示出所有的\(1~n\)的数(可以理解为,小于n的数的二进制,一定不会比n大,那么构成n的这些二进制位,一定是够用的)

那么我们只需要对\(s[i]\)进行二进制拆分,然后把他们看成一个物品

直接上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}const int maxn = 2e5+1e2;int f[maxn];
int n,m;
int c[maxn],w[maxn];
int tmp ;
int main()
{n=read(),m=read();for (int i=1;i<=n;i++){int y=read(),z=read(),x=read();int inv = 1;while (x){inv=min(inv,x);w[++tmp]=inv*y;c[tmp]=inv*z;x-=inv;inv<<=1;}}//for (int i=1;i<=tmp;i++) comemset(f,0xdf,sizeof(f));f[0]=0;for (int i=1;i<=tmp;i++){for (int j=m;j>=c[i];j--){f[j]=max(f[j],f[j-c[i]]+w[i]);}}int ans=-1e9;for (int i=1;i<=m;i++) ans=max(ans,f[i]);cout<<ans;return 0;
}

QwQ 二进制优化的复杂度是\(O(nlogn\times m)\)

然而,我们可以用单调队列做到\(O(nm)\)的(虽然据说常数很大)

这里比较懒,直接放一个dalao的博客了

我就写几点自己的理解吧:

首先,我们是枚举体积的余数和倍数,然后转移
维护单调队列的时候,一定要注意维护队首元素过期
虽然我也不知到这种算法的正确性,不过它运用的思路就是把同样的余数\(m'\),放到一起考虑对

直接上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}const int maxn = 2e5+1e2;int q[maxn],t[maxn];
int head=1,tail=0;void push(int x,int pos,int p)
{while (head<=tail && x>=q[tail])q[tail]=0,t[tail--]=0;q[++tail]=x;t[tail]=pos; while (head<tail && t[head]<pos-p) head++;
}int c[maxn],w[maxn],s[maxn];
int n,m;
int f[110][maxn];int main()
{n=read(),m=read();for (int i=1;i<=n;i++) w[i]=read(),c[i]=read(),s[i]=read();for (int i=1;i<=n;i++){//if (c[i]==0) while (1); int kk = m/c[i]; //int num = min(s[i],kk); //最多能放多少个 for (int j=0;j<c[i];j++) //枚举余数 {head=1,tail=0;int ymh = (m-j)/c[i];for (int k=0;k<=ymh;k++){push(f[i-1][j+k*c[i]]-k*w[i],k,num);f[i][j+k*c[i]]=max(f[i][j+k*c[i]],q[head]+k*w[i]);}}}int ans=-1e9;//for (int i=0;i<=m;i++) ans=max(ans,f[n][i]);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++) ans=max(ans,f[i][j]);cout<<ans;return 0;
}

转载于:https://www.cnblogs.com/yimmortal/p/10160850.html

回归本心QwQ背包问题luogu1776相关推荐

  1. 来自技术人的呐喊:回归本心,远离内卷

    点击上方"LiveVideoStack"关注我们 大家好,我是来自多贝云的客户端团队负责人白天.先简单介绍一下多贝云,作为中国最早的toB在线教室服务提供商,我们曾帮助客户完成了从 ...

  2. 跳出“套路”泥沼,让在线教育回归本心

    近日,中青报·中青网记者采访了多位专家.老师.家长及在线教育从业人员,在试图剖析乱象背后的原因时发现,其实,从家长拿起电话咨询那一刻起,就已经落入了销售人员精心准备的"话术"和&q ...

  3. 回归本心,即证菩提!

    一.人有两次生命的诞生,一次是你肉体出生,一次是你灵魂觉醒.当你觉醒时,你将不再寻找爱,而是成为爱,创造爱!当你觉醒时,你才开始真实的.真正的活着! 二.当你愿利益众生时,所有的资源都会流向你,因为资 ...

  4. 卸下浮躁 回归本心 回归技术

    一转眼 一年半过去了 现在工作快3年了 然而还是感觉 工作没啥技术含量 功能测试 看看请求与返回 偶尔测试接口 负责线上发版 k8s命令也就用那条 apply-f docker日常重启节点(其实也就是 ...

  5. LiveVideoStack Meet回归北京站:未来会更卷吧?

    点击上方"LiveVideoStack"关注我们 9月25日,新回归的LiveVideoStack Meet第一站在北京举行,嘉宾们分享技术.趋势与如何应对内卷的思考. 白天,多贝 ...

  6. 代码随想录算法训练营day42 |动态规划之背包问题 11.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和

    day42 11.分割等和子集 1.dp数组的含义 2.确定递推公式 3.dp数组初始化 4.确定遍历顺序 5.打印dp数组 1049. 最后一块石头的重量 II 1.确定dp数组以及下标的含义 2. ...

  7. 取代java_如何评价 Kotlin?未来是否会取代 Java?

    JVM 语言得摆正自己的地位,既要考量自己的能力,也得考虑历史的进程. Java 是亲儿子,又是 JVM 的"原住民",主导着 JVM 的发展方向,树大根深,枝繁叶茂," ...

  8. 图灵奖获得者 Alan Kay:突破常规思维,创建下一代科研社区(附视频)

    2020 北京智源大会 本文属于2020北京智源大会嘉宾演讲的整理报道系列.北京智源大会是北京智源人工智能研究院主办的年度国际性人工智能高端学术交流活动,以国际性.权威性.专业性和前瞻性的" ...

  9. 最怕的是,你永远也忘不掉 BY顾明烟

    那年我在美国,看上了一只coach的钱包.淡雅的花色,恰到好处的拉链设计,简直是一见钟情.只是168刀的价格对于我一个穷学生并不便宜,于是咬咬牙放下了.但我急需一只钱包,几乎转遍了所有的打折店,企图找 ...

最新文章

  1. 诺丁汉大学高级计算机科学,诺丁汉大学博士生奖学金介绍
  2. WinCE应用程序最小化后的最大化
  3. 跨站访问如何保证session的正常使用
  4. 应用系统中交互式报表功能解析
  5. Async Await
  6. echarts中triggeron与trigger不能同时出现吗_好物|痛风、血糖高、虚不受补能吃它吗?你想知道的阿胶十问十答一锅出!...
  7. 鸿蒙内部测试情况,鸿蒙OS内测曝光,安卓劲敌浮出水面!
  8. 使用工具连接linux中的mysql8.0
  9. SCI从入门到精髓(四)——SCI论文写作技巧
  10. 数据结构--栈和队列记事本
  11. pom文件导入maven依赖
  12. 混淆的艺术-(苍井空变凤姐)Proguard源码分析(一)前言和计划
  13. (13.1.3.9)PMBOK之三:十大知识领域之采购管理
  14. 女主学霸男主学神小说计算机系的,5本双学霸校园甜文:忠犬学神男主VS低情商学霸女主,全程高甜!...
  15. 教你如何做个妖精(女人必读)
  16. 一年365天每天进步 5‰或1%和每天退步 5‰或1%最后的结果分别是多少
  17. 倾斜摄影三维实景模型为智慧城市提供全流程可视化支撑
  18. python 判断矩阵是否正交
  19. 计量大学计算机学院,计算机科学与技术
  20. log4j2远程漏洞事件

热门文章

  1. 关于线性稳压器的基本知识全面解析
  2. 计算机专业常用英语(转)
  3. 以下计算机的分类 不正确,按CPU芯片可分为单片机、单板机、多芯片机和多板机...
  4. VBA中同一模块Sub过程按顺序调用?
  5. 数学励志公式:每天进步一点点
  6. linux ps -ef命令输出详解,Linux-ps命令学习
  7. Linux基础命令必知必会
  8. Games202作业1 Unity(更新完毕)
  9. 怎么选择一个好的企业即时通讯软件
  10. Notepad++的字体设置加Consolas和微软雅黑混合字体转载