【算法】加勒比海盗船——最优装载问题
问题描述
在北美洲东南部,有一片神秘的海域,那里碧海蓝天、阳光明媚,这正是传说中海盗最活跃的加勒比海(Caribbean Sea)。17 世纪时,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活动非常猖獗,海盗不仅攻击过往商人,甚至攻击英国皇家舰.....
有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值。虽然海盗船足够大,但载重量为C,每件古董的重量为w【i】;,海盗们该如何把尽可能多数量的宝贝装上海盗船呢?
算法设计
【1】由于题目中并没有描述每件古董的价值有多高,只说每一件古董都价值连城,所以我们直接认为每一件古董的价值都基本相等
【2】因此尽管可能古董的价值有差,当数量占优势的时候,这些差异也就相比之下可以忽略不计了
【3】当载重量为定值C时,W【i】越小时,可装载的古董数量n越大。只要依次选择最小重量古董,直到不能再装为止
【4】把n个古董的重量从小到大【非递减】排序,然后根据贪心策略尽可能多地选出前i个古董,直到不能继续装为止,此时达到最优
假设每个古董重量如表中所示,海盗船的载重量c为30
重量w[i] | 4 | 10 | 7 | 11 | 3 | 5 | 14 | 2 |
【1】因为贪心策略是每次选择重量最小的古董装入海盗船,因此可以按照古董重量非递减顺序排序,排序后
重量w[i] | 2 | 3 | 4 | 5 | 7 | 10 | 11 | 14 |
【2】按照贪心策略,每次选择重量最小的古董放入【tmp代表古董的重量,ans代表已装载的古董个数】
i=0, 选择排序后的第1个,装入重量tmp=2, 不超过载重量30, ans=1。
i=1,选择排序后的第2个,装入重量tmp= 2+3=5, 不超过载重量30,ans =2。
i=2, 选择排序后的第3个,装入重量tmp=5+4=9, 不超过载重量30, ans =3。
i=3,选择排序后的第4个,装入重量tmp=9+5=14,不超过载重量30,ans=4。
i=4,选择排序后的第5个,装入重量tmp=14+7=21, 不超过载重量30,ans=5。
i=5, 选择排序后的第6个,装入重量tmp=21+10=31, 超过载重量30, 算法结束。
即放入古董的个数为ans=5个。
伪代码设计
【1】数据结构定义 double w
【2】按照重量排序 sort()
【3】按照贪心策略找最优解
Java语言实现
import java.util.Arrays; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub double w[]= {4,10,7,11,3,5,14,2}; Arrays.sort(w); int ans=0; int tmp=0; for(int i=0;i<w.length;i++) { tmp+=w[i]; if(tmp<30) { ans++; } } System.out.println("最后取得的宝物数量为:"+ans); } }
算法复杂度
时间复杂度:
【1】按照古董重量排序,调用sort函数,平均时间复杂度为O(nlogn)
【2】for循环时间复杂度为O(n)
【3】时间复杂度为O(nlogn+n)
空间复杂度:O(1)
- 贪心算法之加勒比海盗船最优装载问题
- 贪心算法一:最优装载问题
- 将最优装载问题的贪心算法推广到2艘船的情形,贪心算法仍能产生最优解吗?
- 算法java实现--贪心算法--最优装载问题
- 贪心算法-4.3最优装载问题
- 2.2加勒比海盗船 最优装载问题
- 高效算法设计_贪心法(最优装载问题,部分背包问题,乘船问题)
- 贪心算法之最优装载问题
- 算法java实现--分支限界法--最优装载问题
- 贪心算法——最优装载问题
- 【回溯法解决最优装载问题】
- 磁带最优存储问题(贪婪算法)
- hdu 2570 //这题想到贪心法有些曲折哈 是一道简单的贪心算法(最优装载问题)
- 加勒比海——最优装载问题
- 最优装载问题(贪心思想)
- 8.4.1(最优装载问题_简单贪心)
- 贪心入门--最优装载问题
- 贪心算法之最优装载
- 最优装载问题
- 悼念512汶川大地震遇难同胞――老人是真饿了(最优装载问题)