原理
-
最优装载问题定义
假设有一艘船,其载重量为c
,有n
个集装箱,每个集装箱的重量分别为w[1], w[2],..., w[n]
,要将这些集装箱装到船上,在不超过船载重量的前提下,尽可能多地装载集装箱,求能装载的最大集装箱数量。 -
贪心算法思路及依据
- 贪心策略选择:按照集装箱重量从小到大的顺序对集装箱进行排序,然后依次选择重量最轻的集装箱装入船中,只要船的剩余载重量允许,就继续选择下一个最轻的集装箱装入,直到船无法再装入任何集装箱为止。这种贪心策略的依据在于,优先选择轻的集装箱能最大程度地利用船的载重量,使得装入的集装箱数量尽可能多,并且可以证明按照这个策略能够得到全局最优解。
步骤
- 对集装箱重量进行排序并记录排序后的索引(
sort_w
函数内)- 首先创建一个辅助数组
w1
,将原始的集装箱重量数组w
的值复制到w1
中(通过循环for(int i = 0; i < n; i++) w1[i] = w[i];
),目的是在不改变原始w
数组的情况下进行排序相关操作。 - 使用两层嵌套的循环实现一种简单的选择排序(类似思路)来对集装箱重量排序(实际上是记录排序后的索引顺序)。外层循环控制排序轮数(共
n
轮,n
为集装箱数量),内层循环用于每一轮在剩余未排序的元素中找到重量最轻的集装箱索引。具体过程如下:- 在内层循环中,通过比较
min
(初始为一个很大的值INF
,用于记录当前找到的最小重量,这里INF
可根据实际情况定义为一个足够大的常数)和w1[j]
的大小,若min > w1[j]
,则更新min
为当前找到的更小重量值,同时记录该最轻重量集装箱的索引minj
。 - 每一轮找到最轻的集装箱后,将其索引记录到数组
t
中(通过t[i] = minj;
),表示在最终排序后的顺序里第i
个位置对应的是原数组中索引为minj
的集装箱,然后将w1[minj]
设置为INF
(相当于标记该元素已处理,在后续轮次中不再参与比较),接着将min
重置为INF
,准备下一轮比较,以此类推,经过n
轮循环后,数组t
中记录了按照重量从小到大排序后的集装箱在原数组中的索引顺序。
- 在内层循环中,通过比较
- 首先创建一个辅助数组
- 根据排序后的顺序往船上装集装箱(
loading
函数内)- 先创建一个数组
t
,用于接收sort_w
函数传递过来的排序后集装箱索引信息。调用sort_w
函数对集装箱按照重量进行排序并获取索引顺序。 - 初始化一个数组
x
,用于标记每个集装箱是否
- 先创建一个数组