当前位置: 首页 > news >正文

关于多重背包的笔记

多重背包可以看作01背包的拓展, 01背包是选或者不选。多重背包是选0个一直到选s个。

for (int i = 1; i <= n; ++i)
{for (int j = m; j >= w[i]; --j){f[j] = max(f[j], f[j - 1*w[i]] + 1*v[i], f[j - 2*w[i]] + 2*v[i],...f[j - s*w[i]] + s*v[i]);}
}

 由上述伪代码可以得知,要实现的多重背包只需要多加一层循环就可以了。

所得的f[m]就是最大价值。

 

//多重背包
#include<iostream>
using namespace std;
const int N = 110;
int f[N], n, m;int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 1; i <= n; ++i){int w, v, s; cin >> w >> v >> s;//重量,体积,数量for (int j = m; j >= w; --j){for (int k = 1; k <= s && k * w <= j; ++k){f[j] = max(f[j], f[j - k * w] + k * v);}}}cout << f[m] << '\n';return 0;
}

上述代码中就是套了一个01背包代码的框架,第三层循环中的 && k * w <= j可以减少不必要的步骤,优化时间。这种方法的时间复杂度为O(n^3),当数据过大的时候时间就会超限。所以接下来有一种求解数据大一些的求解多重背包的算法(多重背包的二进制优化)。

二进制优化的思想是将s个物品分解为log2(s)份,每份都是2的整次的这个个数。然后问题就会变成01背包问题。

 

//多重背包2
//二进制优化
#include<iostream>
#include<vector>
using namespace std;
const int N = 2e3 + 9;
int f[N], n, m;struct Good
{int v, w;
};int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);vector<Good> goods;cin >> n >> m;for (int i = 1; i <= n; ++i){int v, w, s; cin >> v >> w >> s;//将物品分解成log2(s)份//例如将至少使用log2(7)上取整个数来表示0到7这些数字//也就是2^0 2^1 2^2 (1 2 4)//0:都不选//1:只选1// ....//7:都选//若该数字的值不是2的次方-1,例如10,则有log2(10),也就是4个//(1 2 4 8),但是这样连不需要表示的11到15都可以表示出来,所以需要用10-1-2-4//3 - 8 < 0,所以分解为 1 2 4 3for (int k = 1; k <= s; k *= 2){s -= k;goods.push_back({ v * k, w * k });}if (s > 0) goods.push_back({s * v, s * w});}for (auto g : goods){for (int j = m; j >= g.v; --j){f[j] = max(f[j], f[j - g.v] + g.w);}}cout << f[m];return 0;
}

重点:01背包是n个物品每样一个 所以一共是n*1个物品 这里是n个物品每样最多s[i]个 所以总共最多是Σs[i]个, 把每一组的摊开变成一个一个 再进行01背包。也就是上述代码中的注释的选和不选。

 二进制优化参考:AcWing 5. 二进制优化,它为什么正确,为什么合理,凭什么可以这样分?? - AcWing

相关文章:

  • 【C语言】实战项目——通讯录
  • 用python编写九九乘法表
  • 【复杂网络分析与可视化】——通过CSV文件导入Gephi进行社交网络可视化
  • 计算机网络技术的应用探讨
  • 多线程 (上) - 学习笔记
  • 文件函数的简单介绍
  • 加密的艺术:对称加密的奇妙之处(下)
  • 04-Nacos中负载均衡规则的配置
  • 计算机网络:网络层(无分类编址CIDR、计算题讲解)
  • 亿赛通电子文档安全管理系统 SQL注入漏洞复现
  • 分布式块存储 ZBS 的自主研发之旅|元数据管理
  • 深度学习项目部署:解析 NVIDIA Docker 中的 CUDA 镜像版本:base 版本、 runtime 版本、devel 版本
  • 基于linux系统的Tomcat+Mysql+Jdk环境搭建(二)jdk1.8 linux 上传到MobaXterm 工具的已有session里
  • 基于YOLOv8深度学习的吸烟/抽烟行为检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战
  • 我的NPI项目之Android 安全系列 -- EMVCo
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Github访问慢解决办法
  • Java方法详解
  • js中forEach回调同异步问题
  • leetcode386. Lexicographical Numbers
  • Linux后台研发超实用命令总结
  • php中curl和soap方式请求服务超时问题
  • windows下使用nginx调试简介
  • 给第三方使用接口的 URL 签名实现
  • 面试遇到的一些题
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 最近的计划
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • Linux权限管理(week1_day5)--技术流ken
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​业务双活的数据切换思路设计(下)
  • "无招胜有招"nbsp;史上最全的互…
  • #git 撤消对文件的更改
  • $(function(){})与(function($){....})(jQuery)的区别
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)SpringCloud 整合Python
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (新)网络工程师考点串讲与真题详解
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)jdk与jre的区别
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .cn根服务器被攻击之后
  • .net core 6 redis操作类
  • .net core 连接数据库,通过数据库生成Modell
  • .net FrameWork简介,数组,枚举
  • .Net 知识杂记
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET关于 跳过SSL中遇到的问题
  • .NET建议使用的大小写命名原则