一、问题描述

在北美洲南部,有一篇神秘的海域,那里碧海蓝天、阳光明媚。这正是传说中海盗最活跃的加勒比海。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)。

贪心算法--加勒比海盗船--最优装载问题相关推荐

  1. 贪心算法-加勒比海盗船——最优装载问题

    实际问题:一群海盗截获了一艘装满各种金银珠宝和古董的货船,每一件宝物都价值连城一旦打碎就失去了价值.海盗船的载重量为C,每件宝物的重量为Wi,海盗们应该如何把尽可能多的宝物装上船? 问题分析:这是一个 ...

  2. 【贪心】加勒比海盗船-最优装载问题

    题目 在北美洲东南部,有一片神秘的海域,那里碧海蓝天.阳光明媚,这正是传说中海盗最活跃的加勒比海.17 世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻击过 ...

  3. 加勒比海盗船——最优装载问题-贪心算法

    文章目录 加勒比海盗船--最优装载问题 问题分析 算法设计 伪代码详解 代码 加勒比海盗船--最优装载问题  在北美洲东南部,有一片神秘的海域,那里碧海蓝天.阳光明媚,这,正式传说中海盗最活跃的加勒比 ...

  4. 2.2加勒比海盗船——最优装载问题

    2.2加勒比海盗船--最优装载问题 2.2.1问题解析 2.2.2算法设计 2.2.3完美图解 2.2.5实战演练 2.2.6 算法解析及优化拓展 1.算法复杂度分析 2.优化拓展 在北美洲东南部,有 ...

  5. 【贪心算法】加勒比海盗船——最优装载问题

    目录 一.贪心本质 二.贪心的两大重要性质 三.贪心秘籍 四.最优装载问题 五.小结 一.贪心本质 一个贪心算法总是做出当前最好的选择,也就是说,它通过局部最优选择从而得到全局最优的解决方案. --& ...

  6. 算法笔记:加勒比海盗船---最优装载问题 如何将最多的宝物装上船 贪心求解 C++

    问题描述:在北美洲的南部,有一片美丽神秘的海域,名字叫作加勒比海,那里有一群海盗,非常猖獗.有一天海盗收获了很多古董,海盗船的载重为C,每件古董的重量为wi,如何将尽可能多的宝物装上船呢? 思路:很明 ...

  7. 贪心算法之加勒比海盗船最优装载问题

    1.问题 在北美洲东南部,有一片神秘的海域,那里碧海蓝天.阳光明媚,这正是传说中海盗最活跃的加勒比海,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活皇家舰......动非常猖獗,海盗不 ...

  8. 加勒比海盗船——最优装载问题(趣学算法C++代码和python代码)

    C++代码: #include<iostream> #include<algorithm> #include<conio.h> const int N=100000 ...

  9. h0154.加勒比海盗船——最优装载问题

    在北美洲东南部,有一片神秘的海域,那里碧海 蓝天.阳光明媚,这正是传说中海盗最活跃的加勒比 海(Caribbean Sea).17 世纪时,这里更是欧洲大陆 的商旅舰队到达美洲的必经之地,所以当时的海 ...

最新文章

  1. html与文本文件区别,流文件与文本文件的区别
  2. db2 某个字段排序_sql字段排序 rank over
  3. mips j指令_MIPS的基本实现
  4. Win32ASM-进程学习【2】
  5. 计算机一级实训报告册,计算机一级实验报告8.doc
  6. idea整合jboos_在 idea 中 启动 jboss 后, 没有运行部署(通过idea部署)的ssm项目,打开后项目404...
  7. Inside Class Loaders
  8. golang slice分割和append copy还是引用
  9. 访问艺术馆(codevs 1163)树形DP
  10. hadoop包含哪些技术?
  11. 获得android手机root权限,安卓手机root助手教你一键获取手机root权限
  12. 回溯法、动态规划法——牛妹的蛋糕
  13. JS - 数字金额转换中文汉字金额
  14. “鲲鹏”展翅 宝德“自强”
  15. 计算机PS属性怎么改,电脑不用ps怎么改图片分辨率_教你修改图片分辨率的方法...
  16. cpua55和a53哪个好_oppoa53和a55区别哪个好
  17. 04_Mybatis输入\出映射
  18. 微信小程序上传silk格式录音并转码为mp3
  19. javascript 数据类型与类型转换
  20. 关于React 行内样式backgroundImage的设置

热门文章

  1. String为什么要用equals而不用==?
  2. Windows11输入法第一个候选词不显示。
  3. 一文带你了解-Java集合超详解(破天荒总结)
  4. 短距离无线通讯-NFC
  5. CentOS8国内镜像下载地址
  6. 4.2 Ansible中的常用模块
  7. 中科院博士论文致谢走红:求学22载,计算机终成一生的事业
  8. 我在腾讯的他我自我本我和真我
  9. element-ui中导航菜单默认激活子菜单的第一项
  10. 拉斯维加斯国际黑客大会 本周开战