贪心算法--加勒比海盗船--最优装载问题
一、问题描述
在北美洲南部,有一篇神秘的海域,那里碧海蓝天、阳光明媚。这正是传说中海盗最活跃的加勒比海。17世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻击过往商人,甚至攻击英国皇家舰…
有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值,虽然海盗船足够大,但载重量为C,没见古董的重量为wi,海盗们该如何把尽可能多数量的宝贝装上海盗船呢?
二、问题分析
根据问题描述可知这是一个可以用贪心算法求解的最优装载问题,要求装载的物品的数量尽可能多,而船的容量是固定的,那么优先把重量小的物品放进去,在容量固定的情况下,装的物品最多。采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。
三、算法设计
(1)当载重量为定值C时,wi越小时,可装载的古董数量n越大。只要依次选择最小重量的古董,直到不能再装为止;
(2)把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前i个古董,直到不能继续装为止,此时达到最优;
例如:
古董的重量清单
根据重量排完序的重量
根据贪心策略,每次选择重量最小的古董放入(tmp代表已装入古董的重量,ans代表已装载的古董个数)。
次数 | 选择 | 已装重量 | 是否超重 | 装入个数 |
---|---|---|---|---|
i=0 | 选择排序后的第1个 | 装入重量tmp=2 | 低于C=30 | ans=1 |
i=1 | 选择排序后的第2个 | 装入重量tmp=2+3=5 | 低于C=30 | ans=2 |
i=2 | 选择排序后的第3个 | 装入重量tmp=5+4=9 | 低于C=30 | ans=3 |
i=3 | 选择排序后的第4个 | 装入重量tmp=9+5=14 | 低于C=30 | ans=4 |
i=4 | 选择排序后的第5个 | 装入重量tmp=14+7=21 | 低于C=30 | ans=5 |
i=5 | 选择排序后的第6个 | 装入重量tmp=21+10=31 | 超过C=30 | 算法结束 |
即放入古董的个数为ans=5个
四、代码设计
4.1、数据结构定义
根据算法设计描述,我们用一维数组存储古董的重量:
double w[N]; //一维数组存储古董的重量
4.2、按重量排序
可以利用C++中的排序函数sort
,对古董的重量进行从小到大(非递减)排序。要使用此函数需引入头文件:
#include <algorithm>sort(begin, end) //参数begin和end表示一个范围,分别为待排序数组的首地址和尾地址
//sort 函数默认为升序
在本例中只需要调用sort 函数对古董的重量进行从小到大排序:
sort(w, w+n); //按古董重量升序排序
4.3、按照贪心策略找最优解
首先用变量ans记录已经装载的古董个数,tmp代表装载到船上的古董的重量,两个变量都初始化为0。然后按照重量从小到大排序,依次检查每个古董,tmp加上该古董的重量,如果小于等于载重量C,则令ans++;否则,退出。
//tmp 代表装载到船上的古董的重量,ans 记录已经装载的古董个数
int tmp = 0, ans = 0;
for(int i=0; i<n; i++)
{tmp += w[i];if(tmp<=c)ans++;elsebreak;
}
五、代码实战
#include <iostream>
#include <algorithm>
const int N = 1000005;
using namespace std;
double w[N]; //古董的重量数组
int main()
{double c;int n;cout<<"请输入载重量C及古董个数n:"<<endl;cin>>c>>n;cout<<"请输入每个古董的重量,用空格分开:"<<endl;for(int i=0; i<n; i++){cin>>w[i]; //输入每个物品重量}sort(w,w+n);//tmp 代表装载到船上的古董的重量,ans 记录已经装载的古董个数double tmp = 0.0;int ans = 0;for(int i=0; i<n; i++){tmp+=w[i];if(tmp<=c)ans++;elsebreak;}cout<<"能装入的古董最大数量为ans=";cout<<ans<<endl;return 0;
}
六、算法复杂度分析
6.1、时间复杂度
首先需要按古董重量排序,调用sort函数,其平均时间复杂度为O(nlogn),输入和贪心策略求解的两个for语句时间复杂度均为O(n),因此时间复杂度为O(n+nlogn)。
6.2、空间复杂度
程序中变量tmp、ans等占用了一些辅助空间,这些辅助空间都是常数阶的,因此空间复杂度为O(1)。
贪心算法--加勒比海盗船--最优装载问题相关推荐
- 贪心算法-加勒比海盗船——最优装载问题
实际问题:一群海盗截获了一艘装满各种金银珠宝和古董的货船,每一件宝物都价值连城一旦打碎就失去了价值.海盗船的载重量为C,每件宝物的重量为Wi,海盗们应该如何把尽可能多的宝物装上船? 问题分析:这是一个 ...
- 【贪心】加勒比海盗船-最优装载问题
题目 在北美洲东南部,有一片神秘的海域,那里碧海蓝天.阳光明媚,这正是传说中海盗最活跃的加勒比海.17 世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻击过 ...
- 加勒比海盗船——最优装载问题-贪心算法
文章目录 加勒比海盗船--最优装载问题 问题分析 算法设计 伪代码详解 代码 加勒比海盗船--最优装载问题 在北美洲东南部,有一片神秘的海域,那里碧海蓝天.阳光明媚,这,正式传说中海盗最活跃的加勒比 ...
- 2.2加勒比海盗船——最优装载问题
2.2加勒比海盗船--最优装载问题 2.2.1问题解析 2.2.2算法设计 2.2.3完美图解 2.2.5实战演练 2.2.6 算法解析及优化拓展 1.算法复杂度分析 2.优化拓展 在北美洲东南部,有 ...
- 【贪心算法】加勒比海盗船——最优装载问题
目录 一.贪心本质 二.贪心的两大重要性质 三.贪心秘籍 四.最优装载问题 五.小结 一.贪心本质 一个贪心算法总是做出当前最好的选择,也就是说,它通过局部最优选择从而得到全局最优的解决方案. --& ...
- 算法笔记:加勒比海盗船---最优装载问题 如何将最多的宝物装上船 贪心求解 C++
问题描述:在北美洲的南部,有一片美丽神秘的海域,名字叫作加勒比海,那里有一群海盗,非常猖獗.有一天海盗收获了很多古董,海盗船的载重为C,每件古董的重量为wi,如何将尽可能多的宝物装上船呢? 思路:很明 ...
- 贪心算法之加勒比海盗船最优装载问题
1.问题 在北美洲东南部,有一片神秘的海域,那里碧海蓝天.阳光明媚,这正是传说中海盗最活跃的加勒比海,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活皇家舰......动非常猖獗,海盗不 ...
- 加勒比海盗船——最优装载问题(趣学算法C++代码和python代码)
C++代码: #include<iostream> #include<algorithm> #include<conio.h> const int N=100000 ...
- h0154.加勒比海盗船——最优装载问题
在北美洲东南部,有一片神秘的海域,那里碧海 蓝天.阳光明媚,这正是传说中海盗最活跃的加勒比 海(Caribbean Sea).17 世纪时,这里更是欧洲大陆 的商旅舰队到达美洲的必经之地,所以当时的海 ...
最新文章
- html与文本文件区别,流文件与文本文件的区别
- db2 某个字段排序_sql字段排序 rank over
- mips j指令_MIPS的基本实现
- Win32ASM-进程学习【2】
- 计算机一级实训报告册,计算机一级实验报告8.doc
- idea整合jboos_在 idea 中 启动 jboss 后, 没有运行部署(通过idea部署)的ssm项目,打开后项目404...
- Inside Class Loaders
- golang slice分割和append copy还是引用
- 访问艺术馆(codevs 1163)树形DP
- hadoop包含哪些技术?
- 获得android手机root权限,安卓手机root助手教你一键获取手机root权限
- 回溯法、动态规划法——牛妹的蛋糕
- JS - 数字金额转换中文汉字金额
- “鲲鹏”展翅 宝德“自强”
- 计算机PS属性怎么改,电脑不用ps怎么改图片分辨率_教你修改图片分辨率的方法...
- cpua55和a53哪个好_oppoa53和a55区别哪个好
- 04_Mybatis输入\出映射
- 微信小程序上传silk格式录音并转码为mp3
- javascript 数据类型与类型转换
- 关于React 行内样式backgroundImage的设置