285水果店果篮最小成本问题
题解
问题概述
小 C 需要将 n 个编号为 1 到 n 的水果打包成若干个果篮。每个果篮最多可以容纳 m 个水果,且果篮中的水果编号必须连续。每个果篮的成本由以下公式决定:
[ \text{成本} = k \times \left\lfloor \frac{u + v}{2} \right\rfloor + s ]
其中:
k是果篮中水果的数量。u是果篮中水果的最大体积。v是果篮中水果的最小体积。s是一个常数。- (\left\lfloor x \right\rfloor) 表示对
x进行下取整。
目标是找到一种打包方式,使得总成本最小。
解题思路
本题可以使用动态规划的方法来解决。设 f[i] 表示前 i 个水果的最小总成本。状态转移方程的核心思想是考虑最后一个果篮包含的水果数量,并选择使总成本最小的分割方式。
具体步骤
初始化:
- 定义一个数组
f,长度为n + 1,初始化所有元素为正无穷大,表示初始状态下成本无限大。 - 设置
f[0] = 0,表示不放入任何水果时的成本为 0。
- 定义一个数组
动态规划转移:
- 遍历每一个水果位置
i(从 1 到n),尝试将第i个水果作为当前果篮的结尾。 - 对于每个位置
i,向前遍历最多m个水果(因为每个果篮最多容纳m个水果),计算当前果篮的成本,并更新f[i]。 - 在遍历过程中,维护当前果篮中水果的最小值
mi和最大值mx,以及当前果篮中水果的数量cnt。 - 计算当前果篮的成本,并与之前的最小成本进行比较,取较小值作为
f[i]的值。 - 如果当前果篮中的水果数量达到
m,则停止遍历,避免超过果篮的最大容量。
- 遍历每一个水果位置
结果输出:
- 最终,
f[n]即为将所有n个水果打包的最小总成本。
- 最终,
代码解析
1 | |
复杂度分析
- 时间复杂度: O(n * m),其中
n是水果的数量,m是果篮的最大容量。对于每个水果位置,需要遍历最多m个位置。 - 空间复杂度: O(n),用于存储动态规划数组
f。
285水果店果篮最小成本问题
https://kongshuilinhua.github.io/2024/12/26/285水果店果篮最小成本问题/