【发布时间】:2019-04-14 19:50:00
【问题描述】:
我应该对两个分区问题的动态规划实现进行什么修改来解决以下任务:
给定一个正整数数组作为输入,记为 C。程序应决定是否可以将数组划分为两个相等的子序列。您可以从数组中删除一些元素,但不是全部,以使这样的分区可行。
示例:
假设输入是 4 5 11 17 9。如果我们删除 11 和 17,则可能有两个分区。我的问题是我应该对我的两个分区实现进行哪些调整以确定两个分区是否可能(可能需要也可能不需要删除某些元素)或输出即使删除某些元素也是不可能的两个分区。程序应该在 O(sum^2 * C) 时间内运行。
这是我在 Python 中的两个分区实现:
def two_partition(C):
n = len(C)
s = sum(C)
if s % 2 != 0: return False
T = [[False for _ in range(n + 1)] for _ in range(s//2 + 1)]
for i in range(n + 1): T[0][i] = True
for i in range(1, s//2 + 1):
for j in range(1, n + 1):
T[i][j] = T[i][j-1]
if i >= C[j-1]:
T[i][j] = T[i][j] or T[i-C[j-1]][j-1]
return T[s // 2][n]
【问题讨论】:
-
首先要确定您的桌子的尺寸。您当前的算法需要 C*s/2 表,复杂度为 O(C*s)。所需的算法应该具有 O(C*s*s) 复杂度,所以...
-
请说明 [2, 3, 1] 的预期输出以及原因。
-
@גלעדברקן 预期的输出是 {2,1} 和 {3} 因此可以将数组划分为两个相等的子数组。在这种情况下,我们不需要删除任何元素。
-
在这种情况下,我会将“子数组”一词更改为“子集”或“子序列”。我认为子数组主要被理解为连续的。
-
@גלעדברקן 完成。
标签: python-3.x algorithm dynamic-programming