Peter算法小课堂—背包问题

 我们已经学过好久好久的动态规划了,动态规划_Peter Pan was right的博客-CSDN博客

那么,我用一张图片来概括一下背包问题。

大家有可能比较疑惑,优化决策怎么优化呢?答案是,滚动数组,一个神秘而简单的东西。

01背包

题目:小偷来你家,他带的包只能装c斤的财务。你家有n种财务,分别重w1、w2......wn斤,价值分别为v1、v2......,请输出能拿走的最大总价值?

大家思考一下状态定义和状态转移方程。

额……

状态定义

f[i][j]:用前i个物品,每个物品只能选或不选,满足重量和小于等于j的所有选法中,价值最高的那个方案。最终答案:f[n][c]

状态转移方程

首先,我们分两种情况讨论:1.选i   2.不选i

1。 此时我们重量和会变小w[i],但是价值会增加v[i],f[i][j]=f[i-1][j-w[i]]+v[i]

2。 此时物品数减1,f[i][j]=f[i-1][j]

最后,再取最大值,得到状态转移方程:f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])

代码①

for(int i=1;i<=n;i++) cin>>w[i]>>v[i];
for(int i=1;i<=n;++i){for(int j=1;j<=c;++j){if(w[i]>j) f[i][j]=f[i-1][j];else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);}
}
cout<<f[n][c]<<endl;

有点费空间,要开滚动数组

代码②

滚动数组,给大家看个图

我们发现,dp[i][j]这一格,只需要i-1这一行,i-2、i-3……都不需要。题目如果并没有要求中间的状态(比如输出背包的方案),我们就可以将其省略来节省空间的使用。所以我们可以只用一维数组dp[j]来记录数据dp[i][j]的状态,在更新的过程中不断用新的数据dp[j] (dp[i][j]) 覆盖掉旧的数据dp[j](dp[i-1][j])。大家听懂了吗???

代码呢?

#include <bits/stdc++.h>
using namespace std;
const int MAXC=2009;
int n,c,w,v,f[MAXC];
int main(){cin>>c>>n;for(int i=1;i<=n;i++){cin>>w>>v;for(int j=c;j>=w;j--)f[j]=max(f[j],f[j-w]+v);}cout<<f[c]<<endl;return 0;
}

大家可能会疑惑,为什么第二层循环要倒着推啊,我给出一个解释。我们每次计算dp[j] (即dp[i][j]) 的时候都会需要dp[j-w[i]] (即dp[i-1][j-w[i]])的值。所以如果我们正序计算,那么dp[j-w[i]]就已经更新了 (即用过之前的背包了),与每个背包只能用1次不符。那么,这不就是完全背包要的吗?

完全背包

题目:小偷来你家,他带的包只能装c斤的财务。你家有n种财务,每种数量无限多,分别重w1、w2......wn斤,价值分别为v1、v2......,请输出能拿走的最大总价值?

题解请看01背包,这里只给出代码

cin>>c>>n;
for(int i=1;i<=n;i++){cin>>w>>v;for(int j=w;j<=c;j++)f[j]=max(f[j],f[j-w]+v);
}
cout<<f[c]<<endl;

分组背包

分组01与普通01的区别就是,分组01有两组策略:1.选择本组的某一件 2.一件不选

所以说,分组背包编码很麻烦

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll G=19;
const ll N=39;
const ll MAXV=209;
ll c,n,g,f[MAXV];
vector<ll> w[G],v[G]; 
int main(){cin>>c>>n>>g;for(ll i=1;i<=n;i++){ll ww,vv,p;cin>>ww>>vv>>p;w[p].push_back(ww);v[p].push_back(vv);}for(ll i=0;i<=g;i++){//枚举组号for(ll j=c;j>=0;j--){//枚举载重for(ll k=0;k<w[i].size();k++){//枚举物品if(j>=w[i][k]) f[j]=max(f[j],f[j-w[i][k]]+v[i][k]);}}}cout<<f[c]<<endl;return 0;
}

多重背包

多重背包怎么办呢,这里,我们要采用二进制拆分。

就是……这样

void bb01(int w,int v){for(int j=c;j>=w;j--)f[j]=max(f[j],f[j-w]+v);
}
int main(){cin>>n>>c;for(int i=1;i<=n;i++){cin>>w>>v>>s;for(int k=1;k<=s;s-=k;k*=2) bb01(k*w,k*v);if(s) bb01(s*w,s*v);}cout<<f[c]<<endl;return 0;
}

简单吧,其实为什么这里我都没有进行仔细的讲解,是因为……不会,再多思考思考01背包和图片。

混合背包

大家试着写写。大家有兴趣的话可以去往上搜搜“背包九讲”。

希望这些对大家有用,三连必回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/678698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点云标注工具

目录 3d手势识别 c 3d关键点&#xff0c;Bounding Box Labels Rectangle Labels KITTI 3D Ground Truth Annotator c标注工具 3d手势识别 GitHub - 99xtaewoo/Automated-Hand-3D-pose-annotation-Tool: Automated Hand 3D pose annotation Tool c 3d关键点&#xff0c;Bou…

bcdedit /store 填什么,Windows11的BCD文件在哪里?

Windows11为EFI引导&#xff0c;bcd文件在 EFI分区的 \EFI\Microsoft\Boot\BCD 可以选择挂载EFI分区&#xff0c;或者使用如下方式&#xff0c;该路径可充当盘符使用。 例 bcdedit /store Z:\EFI\Microsoft\Boot\BCD /enum /v

【LeetCode每日一题】二维前缀和基本概念与案例

二维前缀和 根据某个块块 的 左上角坐标&#xff0c;和右下角坐标 求出 块块的累加和。 304. 二维区域和检索 - 矩阵不可变 /*** param {number[][]} matrix*/ var NumMatrix function(matrix) {let row matrix.length;let col matrix[0].length;// 初始化一个二维数组&am…

项目02《游戏-13-开发》Unity3D

基于 项目02《游戏-12-开发》Unity3D &#xff0c; 任务 &#xff1a;宠物系统 及 人物头像血条 首先在主面板MainPanel预制体中新建一个Panel&#xff0c; 命名为PlayerInfo 新建Image&#xff0c;作为头像 新建Slider&#xff0c;作为血条 对Panel组件添加一个水…

PE 特征码定位修改程序清单 uiAccess

requestedExecutionLevel level"asInvoker" uiAccess"false" 可以修改这一行来启用禁用原程序的盾牌图标&#xff0c;似乎作用不大。以前没事写的一个小玩意&#xff0c;记录一下。 等同于这里的设置&#xff1a; 截图 代码如下&#xff1a; #include …

谷粒商城【成神路】-【7】——库存系统

目录 &#x1f9c8;1.仓库维护 &#x1f35f;&#x1f35f;1.1配置网关陆游规则 &#x1f35f;&#x1f35f;1.2修改模糊查询 &#x1f95e;2.仓库库存 &#x1f37f;3.采购需需求 &#x1f35f;&#x1f35f;3.1采购的模糊检索 &#x1f35f;&#x1f35f;3.2合并…

system V——进程间通信

上一篇博客中我介绍了system V进程间通信中的内存共享&#xff0c;但是其中还有两 种通信方式&#xff1a;消息队列、和信号量&#xff0c;接下来我将简单介绍一下&#xff0c;消息队列和 信号量以及操作系统是如何看待system V进程间通信的。1. 消息队列 a. 大致介绍 消息队…

4核8G服务器配置性能怎么样?12M带宽配置服务器能干什么?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

CVE-2012-1823 漏洞复现

CVE-2012-1823 PHP SAPI 与运行模式 首先&#xff0c;介绍一下PHP的运行模式。 下载PHP源码&#xff0c;可以看到其中有个目录叫sapi。sapi在PHP中的作用&#xff0c;类似于一个消息的“传递者”&#xff0c;比如在《Fastcgi协议分析 && PHP-FPM未授权访问漏洞 &…

中年低端中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安

文章大纲 旅途规划来回行程的确定南宁 - 北海 - 湛江轮渡成为了最终最大的不确定性&#xff01;感谢神州租车气温与游玩地点总体花费 游玩过程出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州…

工业自动化监控界面与网页、移动UI大相径庭,不能机械照搬。

工业自动化系统监控界面与网页UI、移动UI设计的不同之处主要体现在以下几个方面&#xff1a; 设备和数据展示&#xff1a;工业自动化系统监控界面需要展示大量的设备状态和实时数据&#xff0c;如传感器数据、设备运行状态等。相比之下&#xff0c;网页UI和移动UI设计更注重内容…

【开源】JAVA+Vue.js实现衣物搭配系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣物收藏模块 三、系统设计3.1 用例设计3.2 E-R图设计3.3 数据库设计3.3.1 衣物档案表3.3.2 衣物搭配表3.3.3 衣物收藏表 四、系统实现4.1 登录页4.2 衣物档案模块4.3 衣物搭配模块4.4…

(已解决)Vue routes的 children使用(小白来看,包会!)

前言 分析链接&#xff1a;Vueelement ui实现好看的个人中心_vue个人信息页面代码-CSDN博客 使用了很多vue深层知识&#xff0c;简化并且做到自己的项目上面 对小白很有帮助&#xff0c;因为我就是小白&#xff0c;才搞明白。 最核心的就是routes的 children使用&#xff0c…

C++入门(上)

文章目录 1:什么是C2.C的发展史3:C关键字(C98)4:命名空间4.1:命名空间的概念4.2:命名空间的定义4.3:命名空间的使用4.3.1加命名空间的名称以及域作用限定符4.3.2:使用using将命名空间中某个成员引入4.3.3:使用using namespace 命名空间名称展开命名空间代码1代码2 5:C输入与输出…

pytorch常用激活函数笔记

1. relu函数&#xff1a; 公式&#xff1a; 深层网络内部激活函数常用这个 import matplotlib.pyplot as pltdef relu_fun(x):if x>0:return xelse:return 0x np.random.randn(10) y np.arange(10)plt.plot(y,x)for i ,t in enumerate(x):x[i] relu_fun(t) plt.p…

《21天精通IPv4 to IPv6》第3天:IPv6地址配置——如何为不同的系统配置IPv6?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

2024 年 6 款最佳 PDF 编辑器,您可以免费获得

PDF 作为与 Windows、iOS、Linux 和各种其他操作系统兼容的安全文档格式而享有盛誉。这种广泛的兼容性使 PDF 成为一种流行的选择&#xff0c;几乎每个用户都会在不同的环境中遇到 PDF 文件。无论是合同、发票、电子书、信用卡对账单、银行对账单、税务表格还是保险文件&#x…

算法学习——LeetCode力扣字符串篇

算法学习——LeetCode力扣字符串篇 344. 反转字符串 344. 反转字符串 - 力扣&#xff08;LeetCode&#xff09; 描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地…

精读《js 模块化发展》

1 引言 如今&#xff0c;Javascript 模块化规范非常方便、自然&#xff0c;但这个新规范仅执行了 2 年&#xff0c;就在 4 年前&#xff0c;js 的模块化还停留在运行时支持&#xff0c;10 年前&#xff0c;通过后端模版定义、注释定义模块依赖。对经历过来的人来说&#xff0c;…