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

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

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

朴素的多重背包的复杂度是\(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++) co
memset(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;
}

回归本心QwQ背包问题luogu1776的更多相关文章

  1. 【洛谷p1605】迷宫

    (还记得我昨天大概没人看到的博客(我删辽)吗qwq,2019.4.14下午交的qwq 那篇博客大致内容就是:我提交楼上这道题,交了好久好久好久好久 现在我告诉你,那次评测还N/A着呢qwq) tqlq ...

  2. Java 的几种版本

    1. Java ME Java ME(Java 2 Micro Edition),是为机顶盒.移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的Java API. ...

  3. 你在开发过程中使用Git Rebase还是Git Merge?

    摘要:在git里面经常的一个争论是到底用rebase还是用merge? 1. 痛苦吗?代码历史中的迷失羔羊 我们先来看一个真实的代码提交历史图形化截图: 图片源自 https://storage.kr ...

  4. dp小结|背包问题

    1.先放上0-1背包模板 二维数组 for(int i=1;i<=n;i++)//枚举 物品 for(int j=1;j<=V;j++)//枚举体积 //这个位置是可以正序枚举的. qwq ...

  5. 决策树的剪枝,分类回归树CART

    决策树的剪枝 决策树为什么要剪枝?原因就是避免决策树“过拟合”样本.前面的算法生成的决策树非常的详细而庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的.因此用这个决策树来 ...

  6. 【模板】各种背包问题&讲解

                                        背包问题集合 一般来说,动态规划(DP)都是初学者最难闯过的一关,而在这里详细解说动态规划的一种经典题型:背包问题. 这里介绍的 ...

  7. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  8. SVM分类与回归

    SVM(支撑向量机模型)是二(多)分类问题中经常使用的方法,思想比较简单,但是具体实现与求解细节对工程人员来说比较复杂,如需了解SVM的入门知识和中级进阶可点此下载.本文从应用的角度出发,使用Libs ...

  9. 原创:去繁存简,回归本源:微信小程序公开课信息分析《一》

    以前我开过一些帖子,我们内部也做过一些讨论,我们从张小龙的碎屏图中 ,发现了重要讯息: 1:微信支付将成为重要场景: 2:这些应用与春节关系不小,很多应用在春节时,有重要的场景开启可能性: 3:春节是 ...

随机推荐

  1. 移动端常用单位——rem

    移动端常用单位: ①px:像素大小,固定值 ②%:百分比 ③em(不常用,但是在首行缩进时可以使用):相对自身的font大小(当自身的字体大小也是em做单位时,才会以父元素的字体大小为基准单位) ④r ...

  2. SpringMVC笔记(1)

    一.SpringMVC简介 1.1 MVC模型 MVC模型 MVC全名是Model View Controller,是模型(model)- 视图(view)- 控制器(controller)的缩写,是 ...

  3. Mac超好用的软件合集和系统设置

    软件篇 这些软件好像只有动态壁纸是收费的. 推荐的都是特别小巧,更加专注特定功能,没那么多花里胡哨.当然你们有什么更好用的也可以推荐. 简单,好用才是我最喜欢的. Bob Github开源,Bob 是 ...

  4. Win10 安装WSL2与 Linux子系统

    Win10安装Linux子系统 1. 正常情况 步骤1 - 启用 Windows Linux版本子系统(Windows Subsystem for Linux) dism.exe /online /e ...

  5. IDEA使用教程+JRebel破解

    下载与安装 https://www.jetbrains.com 不装任何插件 破解码 K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZW ...

  6. Golang入门学习(五):异常处理

    文章目录 2.5 错误处理机制 2.5.1 基本说明 2.5.2 入门示例 2.5.3 自定义错误 2.5 错误处理机制 2.5.1 基本说明 Go语言追求简洁优雅,因此并不支持传统的try-catc ...

  7. 远程桌面无法复制粘贴 rdpclip.exe

    在一些意外情况下,远程桌面无法与桌面共享复制内容,这时候需要杀掉一个进程并重新启动 远程桌面复制之后,无法在本地桌面粘贴   在远程桌面中右键点击,选择启动任务管理器   找到一个进行rdpclip. ...

  8. elasticsearch入门到放弃之elasticsearch-head

    elasticsearch-head可理解为跟DBeaver一样是一个数据可视化工具,但是这个工具并没有理想中那么好用坑也是很多,我已经在我的github上fork了一份修改后的版本:https:// ...

  9. vue2.0 前端框架

    在正式开始先复习一下js基础.因为vue最通终也要操作这些元素,vue和以前学的js并不挂勾,他和传统的jquert  设计理念相反 ## js 数据类型 1 基本类型 number  string  ...

  10. Nginx总结(九)Nginx服务器高性能优化的配置--轻松实现10万并发访问量

    前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看nginx系列文章:https://www.cnblogs.com/zhangweizhong/category ...