【发布时间】:2021-12-18 09:13:02
【问题描述】:
我正在尝试解决以下问题(与标题相同):将一个数组划分为最少数量的子数组,使每个子数组的总和在 [w, W] 范围内,注意您不能重新排序大批。我想我需要将 DP 与 2D 状态空间一起使用,但我似乎无法完全弄清楚。
对此的任何帮助将不胜感激!
【问题讨论】:
标签: arrays algorithm dynamic-programming
我正在尝试解决以下问题(与标题相同):将一个数组划分为最少数量的子数组,使每个子数组的总和在 [w, W] 范围内,注意您不能重新排序大批。我想我需要将 DP 与 2D 状态空间一起使用,但我似乎无法完全弄清楚。
对此的任何帮助将不胜感激!
【问题讨论】:
标签: arrays algorithm dynamic-programming
一维数组对于 DP 来说就足够了。称它为 arr,并让 arr[i] 表示同一问题的解决方案,仅限于前 i 个元素。
初始化 arr[i] = infinity for i s.t.直到 & 包括 i 的元素之和为 = w 且
通过考虑所有以 i 结尾的有效子数组,按升序求解 i 的每个未知值,取所有这些存储在 arr 中的最小值,用于有效子数组开始之前的最后一个 elt,并递增 1 .
例如w=3, W=5, 输入 = 2,2,3,4,2,1,1,5
initialize: arr = [inf, 1, ...]
input[2]: arr = [inf, 1, 2, ...]
input[3]: arr = [inf, 1, 2, 3, ...]
input[4]: arr = [inf, 1, 2, 3, inf, ...]
input[5]: arr = [inf, 1, 2, 3, inf, 4, ...]
input[6]: arr = [inf, 1, 2, 3, inf, 4, 4, ...]
input[7]: arr = [inf, 1, 2, 3, inf, 4, 4, 5]
解:[2,2], [3], [4], [2,1,1], [5]
【讨论】: