深入解析:贪心算法之船舶装载问题
一、问题引入
船舶装载问题是经典的贪心算法应用场景,核心目标是:在给定船舶最大载重量的限制下,计算出最多能装载的物品数量。该问题的关键在于如何选择物品装载顺序,以实现 “数量最多” 的目标,而贪心算法通过 “每次选最优” 的策略高效解决此问题。
二、贪心算法原理
1. 核心思路
贪心算法的核心思想是 “局部最优 → 全局最优”。针对船舶装载问题,“局部最优” 即每次选择当前剩余物品中重量最轻的物品进行装载,因为选择轻的物品能最大限度地节省载重量空间,从而为后续装载更多物品创造条件,最终实现 “装载数量最多” 的全局最优目标。
2. 算法步骤
- 输入物品数量、船舶最大载重量以及每个物品的重量。
- 将所有物品按重量升序排序(关键步骤,为 “选最轻” 提供基础)。
- 从排序后的物品中,依次选取物品并累加重量,直到累加重量超过最大载重量为止。
- 统计并返回已装载的物品数量
三、代码结构与优化分析
1. 原始代码核心逻辑
原始代码通过 main 函数完成输入、排序调用和结果计算,maxLoad 函数实现装载数量统计,但存在可读性差、安全性低等问题,具体表现为:
1. 输入提示与计算逻辑混杂在main函数中,代码冗余。
2. 使用原始数组存储物品重量,存在固定大小限制,灵活性不足。
3. 缺乏输入验证,若用户输入非法值(如负数、非数字),程序可能崩溃。
2. 优化后代码解析
优化后的代码基于 C++ 实现,解决了原始代码的缺陷,结构更清晰、安全性更高,具体代码及核心模块分析如下:
(1)头文件依赖
#include // 输入输出流
#include // 包含sort排序函数
#include // 动态数组,替代原始数组
using namespace std;
(2)核心函数 1:maxLoad(计算最大装载数量)
int maxLoad(const vector& weights, double capacity) {
double total = 0.0; // 已装载物品总重量
int count = 0; // 已装载物品数量
// 遍历排序后的物品(范围for循环,C++11及以上特性)
for (const auto& weight : weights) {
if (total + weight <= capacity) { // 若能装下当前物品
total += weight;
++count;
}
else {
break; // 超过载重量,停止装载
}
}
return count;
}
关键优化点:
- 用vector<double>替代原始数组:动态调整大小,避免固定长度限制,提高灵活性。
- const修饰符:确保weights数组在函数内不被修改,提升代码安全性。
- 引用传递(& weights):避免数组拷贝,提高程序运行效率。
(3)核心函数 2:inputWeights(单独处理输入逻辑)
void inputWeights(vector& weights, int n) {
cout > weights[i];
}
}
关键优化点:
输入逻辑与main函数分离:使main函数更简洁,代码可读性提升,后续维护时可单独修改输入逻辑。
(4)main函数
int main() {
int n; // 物品数量
double capacity; // 船舶最大载重量
cout > n >> capacity;
vector weights(n); // 动态数组存储物品重量
inputWeights(weights, n); // 调用输入函数
sort(weights.begin(), weights.end()); // 升序排序(核心步骤)
// 输出结果
cout << "最多能装载的物品数量: " << maxLoad(weights, capacity) << endl;
return 0;
}
执行流程:输入参数→获取物品重量→排序→计算装载数量→输出结果,流程清晰,符合 “贪心算法步骤”。
3. 进一步可优化方向(补充建议)
- 添加输入验证:在inputWeights和main函数中增加判断,如物品数量n需为正整数、物品重量和载重量需为非负数,避免非法输入导致程序异常,示例代码:
// 输入物品数量时验证
while (cin >> n >> capacity, n > weights[i], weights[i] < 0) {
cout << "物品重量不能为负,请重新输入:";
}
- 支持浮点数精度控制:若实际场景中对重量精度有要求(如保留 2 位小数),可使用fixed和setprecision控制输出,需添加头文件#include <iomanip>。
四、复杂度分析
1. 时间复杂度
- 排序操作:使用 C++ 标准库 sort 函数,时间复杂度为 O(n log n)。
- 遍历计算:maxLoad 函数中遍历 vector 数组,时间复杂度为 O(n)。
- 整体复杂度:排序是耗时最长的操作,因此整体时间复杂度为 O(n log n),适用于中等规模数据(如 n≤10⁵),效率较高。
2. 空间复杂度
- 主要空间消耗来自存储物品重量的vector数组,空间复杂度为O(n)。
- 无额外复杂数据结构,空间利用率高。
五、核心知识点总结
- 贪心算法在船舶装载问题中的应用逻辑:“选最轻物品 → 最大化装载数量”,核心是排序后依次选择;
- C++ 代码优化技巧:用vector替代原始数组、函数拆分(输入与计算分离)、const修饰符与引用传递;
- 复杂度关键:排序决定时间复杂度,数组存储决定空间复杂度;
- 工程化改进:输入验证、精度控制等细节可提升代码健壮性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916963.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
Codeforces 1053 (Div.2)
Codeforces 1053 (Div.2)Codeforces 1053 (Div.2)
C. Incremental Stay
题意: 有n个人,存在2*n个时刻,分配这2n个时刻给予n个人进出的时间,输出当博物馆容量为(1-n)时,这些人呆在博物馆的总时长最大值
思路: 对于\…
抗体药物偶联物(ADCs)生物分析:拆解 “靶向导弹” 体内轨迹的核心技术
在肿瘤治疗领域,抗体药物偶联物(ADCs)堪称 “精准导弹”—— 凭借抗体的靶向性将细胞毒性载荷递送至肿瘤细胞,既突破了传统化疗的非特异性毒性,又解决了部分抗体药物疗效不足的问题。截至 2024 年,全球已有十余款…
深入解析:文献阅读 | iMetaMed | FigureYa:一个标准化可视化框架,用于增强生物医学数据解释和研究效率
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
spring boot方案利用Torna生成在线接口文档
spring boot方案利用Torna生成在线接口文档pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…
C#关键字 unchecked与checked - 教程
C#关键字 unchecked与checked - 教程2025-09-25 12:22
tlnshuju
阅读(0)
评论(0) 收藏
举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…
做营销型网站的教程网站建设方案论文1500
6,BGP的基本配置 1,BGP建邻的基本关系 1,EBGP对等体关系直接建邻 [r1]bgp 1----启动BGP进程---后面的1不是进程号,而是配置路由器所在AS的AS号 [r1-bgp] [r1-bgp]router-id 1.1.1.1---配置RID [r1-bgp]peer 12.0.0.2 as-number-…
网站建设分析徐州整站优化
shell的模拟实现
我们知道shell是一个永不退出的程序,所以他应该是一个死循环,并且shell为了防止影响到自己,我们在命令行上输入的所有命令都是由shell的子进程来执行的,所以它应该要有创建子进程的相关函数,当然也会…
网站外链建设工作计划建站合作
第3部分 hashCode() 的作用
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCo…
详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学
详细介绍:微服务的适用边界:从金融科技到量子计算的架构哲学pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…
静态网站可以做哪些wordpress有后端吗
一.选择题 1、适宜采用inline定义函数情况是(C) A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A (1);”语句后,…
网站开发招标参数学校网站建设的应用意义案例
来源:SpringBoot 那些天生自带 Buff 的工具类,你用过几个?
断言 断言是一个逻辑判断,用于检查不应该发生的情况 Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启 SpringBoot 中提供了 Assert …
不用js可以做网站吗网站建设费应开具互联网信息服务吗
本文主要向大家介绍了MySQL数据库之在CentOS7上安装MySQL5.7 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。获取RPM包# wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm列出RPM包里都有哪些文件# rpm -q…
公司网站建设应注意事项北京的软件公司集中在哪个区
文章目录 9.1 DApp 的架构和设计9.1.1 基础知识解析更深入的理解实际操作技巧 9.1.2 重点案例:去中心化社交媒体平台案例 Demo:创建去中心化社交媒体平台案例代码SocialMedia.sol - 智能合约前端界面 测试和验证拓展功能 9.1.3 拓展案例 1:去…
59网站一起做网店普宁网站 代备案
1.开启时钟 把需要使用的USART和GPIO的时钟打开
2.GPIO初始化 把TX配置成复用输出,RX配置成输入
3.配置USART 直接使用一个结构体即可将所有参数配置完成
4.开关控制 如果需要仅发送的功能,就直接开启USARTÿ…
网站后台程序手机网页怎么改成电脑版
现在越来越多的人都开始通过二维码的方式来传递文件,将word、pdf、excel、pdf等格式的文件通过扫码的方式展示或者下载文件,这种方式有很多的优势,包括传播速度快成本低,只需要生成一张二维码图片,就可以让其他人能够同…
使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案
使用IOT-Tree整合复杂计算模型(含AI模型),并对接现场设备优化控制(节能提效)技能方案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important…
为什么应该测试无JavaScript的页面体验
本文探讨了JavaScript可能失效的各种场景(如网络问题、浏览器扩展限制等),介绍了渐进增强的实践方法,并说明了当页面必须依赖JavaScript时的优雅降级方案。通过具体代码示例展示如何构建更具韧性和可访问性的网站。…
完整教程:UE5小游戏开发 - 武士决斗
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡
经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡1 DIP核心思想与三层架构概述
依赖倒置原则(Dependency Inversion Principle,DIP)作为SOLID原则中的重要组成部分,其核心主张是高层模…