程序设计实践-第8关:205_背包
背包问题:
原始的0-1背包
任务描述
又快到了寒假时间,说到寒假,免不了出去玩耍,小蒋今天要去郊游,她想带点零食去,但是她的包包大小有限,所以她需要在n
个零食中挑选若干零食装入包包,最多能装多满?假设包包的大小为m
,每袋零食的大小为A[i]
。
样例
如果有4
个零食大小是[2, 3, 5, 7]
。 如果包包的大小为11
,可以选择[2, 3, 5]
装入背包,最多可以装满10
的空间。 如果包包的大小为12
,可以选择[2, 3, 7]
装入背包,最多可以装满12
的空间。
测试说明
平台会对你编写的代码进行测试:
测试输入: 11
2 3 5 7
预期输出: 10
对于背包问题,有
01背包的状态转移方程为//i代表对i件物体做决策,有两种方式—放入背包和不放入背包。
j表示当前背包剩余的容量。
f[i][j](表示在第i 个物体,第j个容量情况下的最大价值)= max(f[i - 1][j], f[i - 1][j - w[i]] + v[j])
w[i]表示物体i的重量,v[i]表示物体i的价值
这里会做一个判断,比较f[i-1][j],f[i-1][j-w[i]]+v[j],比较哪种情况下价值更大,然后选取价值更大的一个。
for (int i = 1; i <= n; i++)
{for (int j = V; j >= 0; j--){if (j >= w[i])//如果背包装得下当前的物体{f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);}else//如果背包装不下当前物体{f[i][j] = f[i - 1][j];}}
}
可以发现如下问题:
(1)状态表f的遍历顺序为从第1行开始一行一行遍历,且在遍历第i行时候不会用到第i-2行数据,也就是i-2行及以前的数据没有用了,可以清除。同时,第i-1行的数据每个只会用到一次。
(2)遍历每一行时候只用到当前容量j和j-w[i]的数据,也就是第 i 次遍历只需要 第 i-1 次遍历中容量小于等于 j 的数据 。
所以我们可以按照如下方法优化f的空间复杂度:
f[j] = max(f[j], f[j - w[i]] + v[j])
for (int i = 1; i <= n; i++)
{for (int j = V; j >= w[i]; j--){ f[j] = max(f[j], f[j - w[i]] + v[i]); }
}
else 可以省去(不用自己给自己赋值)
从本质上说,这种优化方法针对了上述的两个问题:
(1)把遍历第i个物体和遍历第i-1个物体时的最大价值存在一个单元里。更新前f[j]存i-1的价值,更新后f[j]存i的价值。因为用不到i-2及以前的数据所以不需要存。因为以后不会再用到i-1的价值所以被覆盖了没问题
(2)j从背包容量V开始遍历,即从大到小遍历,保证了当前f[j]和f[j - w[i]]里面存的是i-1的数据,即等价于f([i])[j] = max(f([i - 1])[j], f([i - 1])[j - w[i]] + v[i]),从而和优化空间复杂度前状态转移方程的原理一致。
程序设计实践-第8关:205_背包相关推荐
- 湘潭大学2022软件工程程序设计实践平时练习一C/C++
第1关:101_求最长的公共字符串 任务描述 系统会给出两个字符串,你需要获取到这两个数据(方法同从键盘获取一样),并找到他们最长的公共字符串,并且将他们的长度打印. 样例 输入ABCD,CBCE 返 ...
- Akka应用模式:分布式应用程序设计实践指南pdf
下载地址:网盘下载 对于想要学习Akka的Java 和 Scala 开发者们,有很多技术资源可供参考,但是如要想知道如何去应用这些技术就需要不同的思维方式了.为了帮助你正确地使用Akka,<Ak ...
- python语言程序设计实践教程答案实验六_Python程序设计实践教程
书名:Python程序设计实践教程 定价:29.8 ISBN:9787115532602 作者:储岳中 薛希玲 版次:*1版 出版时间:2020-04 内容提要: 本书是Python语言程序设计的配套 ...
- c语言程序设计实践教程课,C语言程序设计实践训练教程
计算机实践训练课程是程序设计课程中必不可少的一个环节.目的是训练读者综合运用该课程的知识与技巧的能力,达到理论联系实际.学以致用. 本书是与<C语言程序设计教程>和<C语言程序设计实 ...
- c语言程序设计实践课选题,c语言程序设计实践实验题目
c语言程序设计实践实验题目 绥化学院程序设计实践实验报告范例 参考1实验题目:循环结构程序设计实验目的:1.熟悉 VC++6.0 的运行环境,掌握 C 程序的执行方法:2.掌握三种基本数据类型.部分运 ...
- c语言做一个小程序报告,《C语言程序设计实践》课程报告30个小程序组合成一个大程序.doc...
北方民族大学 课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : 软件工程(2)班 学 生 姓 名 : 李思良 学 号 : 任 课 教 师 : 王晓锋 学 期 : 2015-2016学 ...
- python程序设计实践教程答案-Python程序设计实践教程
书名:Python程序设计实践教程 定价:29.8 ISBN:9787115532602 作者:储岳中 薛希玲 版次:*1版 出版时间:2020-04 内容提要: 本书是Python语言程序设计的配套 ...
- 桂林理工大学 程序设计实践课程 实习报告
学 号: 320205205# 桂林理工大学 GUILIN UNIVERSITY OF TECHNOLOGY 程序设计实践课程 实习报告 学 院: 信息科学与工程学院 # ...
- 迷宫_随机实验_边做边学深度强化学习:PyTorch程序设计实践(1)
迷宫_随机实验_边做边学深度强化学习:PyTorch程序设计实践 0.相关文章 1.导入所使用的包 2. 定义迷宫 3.定义迷宫动作 4.策略参数θ转换为行动策略π 5.定义随机移动函数 6.定义使智 ...
最新文章
- 链接被点击的默认行为——带到另一个窗口
- MIT+IBM同时利用AI探索神经科学,让脑科学研究如虎添翼
- Redhat、CentOS进单用户模式进行维护
- 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_权重/参数初始化...
- html怎么在图片上加文字_怎么把图片文字转换成word文档
- android 自定义库,Android自定义Log库
- 1748. 唯一元素的和
- 遇到一个Linux系统文件被删除后仍占用磁盘的问题
- RedHat Linux下Samba配置(简单配置)-转
- nodejs后台系列--第四篇--koa(二)
- 上传新文件项目到svn上
- web端实现类微信的语音播放效果
- 全新版大学英语综合教程第三册学习笔记(原文及全文翻译)——8 - A Clone Is Born(克隆生命诞生了)
- vs2010背景图片配置方法
- JavaScript对象的声明及操作
- 基于STM32设计智能称重系统(华为云IOT)
- 精选腾讯出品的 16 款小程序
- Design the Web: Add a Twitter Timeline 设计网页:添加Twitter时间轴 Lynda课程中文字幕
- 电话机器人源码和系统部署
- HBuilder下载