最优装载问题(贪心)

原理

  1. 最优装载问题定义
    假设有一艘船,其载重量为 c,有 n 个集装箱,每个集装箱的重量分别为 w[1], w[2],..., w[n],要将这些集装箱装到船上,在不超过船载重量的前提下,尽可能多地装载集装箱,求能装载的最大集装箱数量。

  2. 贪心算法思路及依据

    • 贪心策略选择:按照集装箱重量从小到大的顺序对集装箱进行排序,然后依次选择重量最轻的集装箱装入船中,只要船的剩余载重量允许,就继续选择下一个最轻的集装箱装入,直到船无法再装入任何集装箱为止。这种贪心策略的依据在于,优先选择轻的集装箱能最大程度地利用船的载重量,使得装入的集装箱数量尽可能多,并且可以证明按照这个策略能够得到全局最优解。

步骤

  1. 对集装箱重量进行排序并记录排序后的索引(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 中记录了按照重量从小到大排序后的集装箱在原数组中的索引顺序。
  2. 根据排序后的顺序往船上装集装箱(loading 函数内)
    • 先创建一个数组 t,用于接收 sort_w 函数传递过来的排序后集装箱索引信息。调用 sort_w 函数对集装箱按照重量进行排序并获取索引顺序。
    • 初始化一个数组 x,用于标记每个集装箱是否
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值