【动态规划】【背包】多重背包二进制优化(简单易懂)和【题解】——【洛谷P1776】宝物筛选
【动态规划】【背包】多重背包二进制优化简单易懂和【题解】【洛谷P1776】宝物筛选0.前言1.思路解析2.AC代码0.前言欠的债总是要还的。今天来把多重背包二进制优化补完。建议先食用【动态规划】【背包】多重背包模型讲解附C代码实现1.思路解析还是老样子动态规划五步走。好吧你们都很熟悉了那这里就只谈优化。先把原本的代码贴出来。#includebits/stdc.husingnamespacestd;#defineMAXM1010//m的数据范围可根据题目修改#defineMAXN1010//n的数据范围可根据题目修改//m表示背包的重量n表示物品的数量,dp[j]表示当前重量上限为j时的最大价值intm,n,dp[MAXM],cnt;structobject{intweight,value;//储存每个物品的重量和价值object(int_w0,int_v0):weight(_w),value(_v){};}a[MAXN];intmain(){scanf(%d%d,m,n);for(inti1;in;i){//输入n个物品intw,v,m;//存储当前物品的重量,价值和件数scanf(%d%d%d,w,v,m);for(intj1;jn;j)a[cnt]object(w,v);//展开}for(inti1;icnt;i)for(intjm;ja[i].weight;j--)//枚举所有能装下a[i]的重量dp[j]max(dp[j],dp[j-a[i].weight]a[i].value);printf(%d\n,dp[m]);return0;}看一下有哪里可以优化的。状态转移这已经是最朴素的01 背包 01背包01背包转移了。已经没有优化的余地了至少现在是。输入输出已经使用scanf,printf了也优化不了了。那该怎么办我们就只可以优化铺平了。可以发现如果直接暴力展平那么就会导致大量的重复计算。我们的目标就是将当前物品的个数m拆解成几个数并且能够表示0~m之间的所有数。什么意思呢比如m3可以拆成21就是现将两个物品打包成一个大物品它的价值和重量都是单个物品的2倍1同理就是单个的。或者m4可以拆解成31或211或者更多。需要找到一个符合上面描述的序列。那么我们就很容易联想到了二进制。我们拿9来举例。9的二进制形式是1001 1 ∗ 2 3 0 ∗ 2 2 0 ∗ 2 1 1 ∗ 2 0 8 1 10011*2^30*2^20*2^11*2^08110011∗230∗220∗211∗2081。那么我们可以先把9 99拆成4 2 1 421421剩下的先不动。那么如果加上4 44就代表二进制中从右往左第三位被选取了即100 2 100_21002​否则就是没选取。其它的同理比如加上2 22就代表二进制中从右往左第二位被选取了即10 2 10_2102​。又容易想到这样我们就能表示出0到7所有的数了。那还剩下2呢直接放进去不需要管了。为什么呢我们现在的问题就是要把剩下的8和9表示出来。很简单26不就等于8 88吗27不就等于9 99吗那么使用上面那个策略我们就成功的用几个数字表示出来0~m了。如果还是看不懂的同学可以自己尝试代数理解一下或者在评论区提出自己的疑惑哦。我会尽力为你解答。那么接下来就是如何编写代码的问题了。我们首先从1开始尝试每次*2来找到下一个二进制位对应的十进制数代码中使用位运算代替效率更快并从m中减掉放到a数组里面去。直到下一位需要的数比剩下的部分还大为止。如果有剩余的部分那么就直接放进去就行了关键代码如下for(intj1;jm;j1){// 二进制展开a[cnt]object(v*j,w*j);m-j;}if(m)a[cnt]object(v*m,w*m);// 还有剩下的这段代码的时间复杂度成功降到了O ( W log ⁡ n ) O(W\log n)O(Wlogn)可以通过此题。2.AC代码#includebits/stdc.husingnamespacestd;#defineMAXN100010// m的数据范围可根据题目修改// cnt储存当前物品数量,dp[i]储存当前背包容量为j时的最大值intn,W,cnt1,dp[MAXN];structobject{// 储存每一个物品的信息intv,w;// 价值和重量object(int_v0,int_w0):v(_v),w(_w){}}a[MAXN];intmain(){cinnW;for(inti1;in;i){intv,w,m;cinvwm;for(intj1;jm;j1){// 二进制展开a[cnt]object(v*j,w*j);m-j;}if(m)a[cnt]object(v*m,w*m);// 还有剩下的}for(inti1;icnt;i)// 01背包for(intjW;ja[i].w;j--)dp[j]max(dp[j],dp[j-a[i].w]a[i].v);coutdp[W];return0;}最后制作不易希望大家多多点赞收藏关注下微信公众号谢谢大家的关注您的支持就是我更新的最大动力公众号上会及时提供信息学奥赛的相关资讯、各地科技特长生升学动态、还会提供相关比赛的备赛资料、信息学学习攻略等。

相关新闻

快速批量获取网易云和QQ音乐LRC歌词的终极免费解决方案

快速批量获取网易云和QQ音乐LRC歌词的终极免费解决方案

快速批量获取网易云和QQ音乐LRC歌词的终极免费解决方案 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为本地音乐库缺少歌词而烦恼吗?163MusicLyrics是一…

2026/7/15 15:06:46 阅读更多 →
Java后端对接多版本美团外卖霸王餐API时的适配器模式与版本兼容处理

Java后端对接多版本美团外卖霸王餐API时的适配器模式与版本兼容处理

Java后端对接多版本美团外卖霸王餐API时的适配器模式与版本兼容处理 在对接外卖CPS(Cost Per Sale)业务时,后端开发者最头疼的问题之一莫过于上游API的版本迭代。以美团外卖霸王餐API为例,随着业务的发展,接口协议&…

2026/7/15 15:02:44 阅读更多 →
终极指南:如何轻松安装REPENTOGON脚本扩展器解决3大常见问题

终极指南:如何轻松安装REPENTOGON脚本扩展器解决3大常见问题

终极指南:如何轻松安装REPENTOGON脚本扩展器解决3大常见问题 【免费下载链接】REPENTOGON Script extender for The Binding of Isaac: Repentance 项目地址: https://gitcode.com/gh_mirrors/re/REPENTOGON 想要为《以撒的结合:悔改》添加更多功…

2026/7/15 15:02:44 阅读更多 →

最新新闻

麻雀搜索算法优化BP神经网络预测以及MATLAB代码实现

麻雀搜索算法优化BP神经网络预测以及MATLAB代码实现

麻雀搜索算法SSA优化BP神经网络回归预测以及MATLAB代码实现 文章目录 麻雀搜索算法SSA优化BP神经网络回归预测以及MATLAB代码实现1. 麻雀搜索算法SSA原理1.1 算法灵感来源1.2 算法模型描述 2. SSA优化BP神经网络预测算法流程3. SSA优化BP回归预测的MATLAB实现步骤4. 运行结果与…

2026/7/15 16:08:21 阅读更多 →
Uncle小说阅读器:重新定义PC端数字阅读体验的三大技术突破

Uncle小说阅读器:重新定义PC端数字阅读体验的三大技术突破

Uncle小说阅读器:重新定义PC端数字阅读体验的三大技术突破 【免费下载链接】uncle-novel 📖 Uncle小说,PC版,一个全网小说下载器及阅读器,目录解析与书源结合,支持有声小说与文本小说,可下载mob…

2026/7/15 16:02:16 阅读更多 →
VS Code Git 工作树:解锁多分支并行开发新体验

VS Code Git 工作树:解锁多分支并行开发新体验

引言:多分支开发的痛点与 Git 工作树的曙光 传统 Git 分支切换的困扰:上下文丢失、环境冲突、效率低下。Git 工作树(Worktree)是什么?一个仓库,多个独立工作目录。VS Code 原生集成 Git 工作树:…

2026/7/15 16:02:16 阅读更多 →
EasyOCR实战指南:解锁多语言OCR识别的高效解决方案

EasyOCR实战指南:解锁多语言OCR识别的高效解决方案

EasyOCR实战指南:解锁多语言OCR识别的高效解决方案 【免费下载链接】EasyOCR Ready-to-use OCR with 80 supported languages and all popular writing scripts including Latin, Chinese, Arabic, Devanagari, Cyrillic and etc. 项目地址: https://gitcode.com/…

2026/7/15 16:00:15 阅读更多 →
小程序毕业设计-基于 SpringBoot + 小程序的在线答题系统 基于 SpringBoot 的在线考试测评系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

小程序毕业设计-基于 SpringBoot + 小程序的在线答题系统 基于 SpringBoot 的在线考试测评系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/15 16:00:15 阅读更多 →
专业B站视频下载器BilibiliDown:3分钟掌握高效离线收藏完整指南

专业B站视频下载器BilibiliDown:3分钟掌握高效离线收藏完整指南

专业B站视频下载器BilibiliDown:3分钟掌握高效离线收藏完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_…

2026/7/15 15:58:15 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/14 14:00:13 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻