中兴--维克多博士问题(背包问题升级版)
题目描述:
维克多博士创造了一个裂变反应堆,可取用处于液体状态的放射性物质。反应堆的容量是V加仑。他有N瓶的放射性液体,每个都有一定的质量和一定的体积。当液体倒入反应堆时,也产生一些单位的能量。现在,维克多想要将能量输出最大化。但是,有一个限制条件。他研究了原子元素的物理知识和历史,认识到反应堆内放射性液体的总量不能超过特定的临界质量M,否则反应就会失控,并引发剧烈的爆炸。写一个算法,帮助他从反应堆获得最大的能量,而不会让他丢掉性命。
输入:
该函数/方法的输入包括六个参数------
reactorCap,一个整数,表示反应堆的容量(V);
numberOfRadLiquid,一个整数,表示现有小瓶的数量(N);
criticalMass,一个整数,表示反应堆的最大临界质量(M);
volumes,一个整数列表,按顺序表示N份放射性液体的体积;
masses,一个整数列表,按顺序表示N份放射性液体的质量;
energies,一个整数列表,按顺序表示N份放射性液体产生的能量。
输出:
返回一个整数,表示可给定的约束条件下从反应堆中产生的最大能量。
示例:
输入:
reactorCap=100
numberOfRadLiquid=5
criticalMass=15
volumes=[50,40,30,20,10]
masses=[1,2,3,9,5]
energies=[300,480,270,200,180]
输出:
960
解释:
通过选择1、2、5号瓶中的液体,产生的能量=300+480+180=960。
这种液体组合产生的总体积=50+40+10=100,不大于reactorCap,造成反应堆中的总质量=1+2+5=8,不大于criticalMass。
解题思路:这是一个有两个限制条件的0-1背包问题,0-1背包问题可以参考我的另一篇博文:0-1背包问题,这里只需将一个限制条件的二维动态规划表变成一个三维动态规划表。
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass, int *volumes, int *messes, int *energies)
{vector<vector<vector <int>>> maxValue;vector<vector <int>> tmpTmp;vector<int> tmp;for (int i = 0; i < numberOfRadLiquid + 1; i++){for (int j = 0; j < reactorCap + 1; j++){for (int k = 0; k < criticalMass + 1; k++){tmp.push_back(0);}tmpTmp.push_back(tmp);tmp.clear();}maxValue.push_back(tmpTmp);tmpTmp.clear();}for (int i = 1; i <= numberOfRadLiquid; i++){for (int j = 1; j <= reactorCap; j++){for (int k = 1; k <= criticalMass; k++){if (i == 1){if ((volumes[i - 1] <= j) && (messes[i - 1] <= k)){maxValue[i][j][k] = energies[i - 1];}else{maxValue[i][j][k] = 0;}}else{int topValue = maxValue[i - 1][j][k]; // 上一个网格的值int thisValue = ((volumes[i - 1] <= j) && (messes[i - 1] <= k) ? // 当前商品的价值 + 剩余空间的价值((k - messes[i - 1] > 0)&&(j - volumes[i - 1] > 0) ? energies[i - 1] + maxValue[i - 1][j - volumes[i - 1]][k - messes[i - 1]] :energies[i - 1]): topValue);// 返回 topValue和thisValue中较大的一个maxValue[i][j][k] = (topValue > thisValue ? topValue : thisValue);}}}}vector<bool> result;for (int i = 0; i < numberOfRadLiquid; i++){result.push_back(false);}for (int i = numberOfRadLiquid, j = reactorCap, k = criticalMass; i > 0; i--){if (maxValue[i][j][k] > maxValue[i - 1][j][k]){result[i - 1] = true;j = j - volumes[i - 1];k = k - messes[i - 1];}}int sum = 0;for (int i = 0; i < result.size(); i++){if (result[i]){sum += energies[i];}}return sum;
}
中兴--维克多博士问题(背包问题升级版)相关推荐
- 【笔试题】维克多博士创造了一个裂变反应堆
获得能量堆最大的能量(Java和C++)(中兴在线笔试题) 题目描述: 维克多博士创造了一个裂变反应堆,可取用处于液体状态的放射性物质.反应堆的容量是V加仑.他有N瓶的放射性液体,每个都有一定的质量和 ...
- 2020秋招笔试题总结(华为、360、京东、中兴、快手、字节跳动、阿里、拼多多、腾讯、VIVO)~持续更新
目录 1.华为 1.1全量和已占用字符集合 1.2解析逻辑字符串 1.3比特块 1.4文本解析 1.5社交软件好友度 2.360 2.1表面积 2.2寻找子串 2.3散步 3.京东 3.1最多能完成排 ...
- 功能最全面 体验更极致 小兴看看mini升级版9月19日首发
小兴看看mini升级版自发布之日起就备受网友关注.作为目前功能最全面的智能摄像头,小兴看看mini升级版首发当天抢购一空,现在京东进行第二轮预约发售.预约的用户,可享受远低于同类产品的99元首发超值价 ...
- 中兴echat_中兴高达推出新一代eChat小先锋e350
原标题:中兴高达推出新一代eChat小先锋e350 公网集群领域有一款机型人称"小钢炮",发货量破30万台,广泛应用于城管.物业.交警.旅游及大型赛事,成为一个有口皆碑的传奇,获得 ...
- 【数据结构与算法】【算法思想】动态规划
贪心算法 回溯算法 分治算法 动态规划 贪心:一条路走到黑,就一次机会,只能哪边看着顺眼走哪边 回溯:一条路走到黑,无数次重来的机会,还怕我走不出来 (Snapshot View) 动态规划:拥有上帝 ...
- CCF YOCSEF(厦门)——区块链大规模商用,三年内能否实现?
4月20日,CCF YOCSEF厦门"区块链大规模商用,三年内能否实现?"论坛在福建厦门成功举办. 论坛由中国计算机学会主办,福建省区块链协会.CCF YOCSEF厦门学术委员会承 ...
- 动态规划从理论到实践-深入理解贪心/分治/回溯/动态规划的算法思想
摘要:本文主要讲解常见的四种算法,分别为贪心算法:第一步选择最优的走法,算法不能做到全局最优:分治算法:一种处理问题的思想,使用递归来实现:回溯算法:我们枚举所有的解,找到满足期望的解,可以把求解过程 ...
- 《预训练周刊》第14期:World-GAN:Minecraft 世界的生成模型、CMU博士论文探究可控文本生成...
No.14 智源社区 预训练组 预 训 练 研究 观点 资源 活动 关于周刊 超大规模预训练模型是当前人工智能领域研究的热点,为了帮助研究与工程人员了解这一领域的进展和资讯,智源社区整理了第14期&l ...
- 算法--中兴面试:输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数, 使其和等于 m
转载请注明原文出处:http://blog.csdn.net/baidu_37107022/article/details/75125846 Q题目 编程求解 输入两个整数 n 和 m,从数列1,2, ...
- 动态规划算法(Dynamic Programming)之0-1背包问题
文章目录 1. 问题引入 2. 动态规划求解0-1背包 3. 复杂度 4. 0-1背包升级版(带价值) 5. 0-1背包升级版(带价值)DP解法 1. 问题引入 前面讲了0-1背包的回溯解决方法,它是 ...
最新文章
- java.lang.RuntimeException: setParameters failed
- 考公务员的本科学历可以考吗
- 设计模式--模板方法(Template Method)模式
- 项目范围管理——知识要点
- 将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读
- oracle中的merge into用法解析
- mybatis 自动生成integer_通过mybatis-generator-core工具自动关联表生成对应model、mappers及dao层代码类完整教程...
- 20145228《网络对抗》 后门原理与实践
- php与web服务器关系
- 一篇文章搞懂富人的内在逻辑|普通人如何改变命运?【财富02】
- 解决Win7安装C++ Redistributable2015失败
- Performance Test Framework (PTF)是压力测试框架
- linux kernel mtd 分区
- K-means算法和K临近算法
- 怎样演讲演讲幽默有趣
- linux下清理信号量,Linux下进程间通信方式——信号量(Semaphore)
- STM32F4-Discovery
- 一个简单的分频器结果时钟信号总是呈现高阻态。
- heroku部署python-docker的web服务器
- kali 安装所有工具软件
热门文章
- 3个步骤+1个模型,「数据分析」才是「增长黑客」的核心技能
- 为什么DDR电源设计时需要VTT电源?
- 超简单!Oneplus一加手机安装谷歌服务框架Google Play商店下载应用,安装谷歌三套件
- coldfusion_在Windows上安装和配置ColdFusion MX 6.1
- word涂改涂掉图片_word画图-厉害了Word哥!原来还可以这样画图
- 解决is exceeding the 65535 bytes limit问题
- git 中 HEAD 概念
- python中的head函数_Pandas DataFrame.head()用法例子
- 音乐相册源码php,分享使用JavaScript制作微信音乐相册实例
- zipoutputstream 进行解压缩时winrar提示:不可预料的压缩文件末端