您的位置:首页 > 其它

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

2022-03-29 16:47 681 查看

问题描述

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: