Problem:给定一个大小为N的数组,是否可以将数组分成两组,每组恰好为N / 2个元素,使得两个组中的元素总和相等?
我尝试过:如果dp[i][j]
元素总和为j
,则使用子集和的概念,其中i
为真。最后答案是dp[sum/2][len(array)/2]
。
def equal_subset(a):
s = sum(a)
if len(a)%2 != 0 or s%2 != 0:
return False
dp = [[0 for j in range(len(a)+1)] for i in range(s+1)]
dp[0][0] = 1
for i in range(1, s/2+1):
for j in range(1, (len(a)+1)):
dp[i][j] = dp[i][j-1]
if i >= a[j-1]:
dp[i][j] = dp[i][j] or dp[i-a[j-1]][j-1]
return dp[s/2][len(a)/2]
print(equal_subset([2, 10, 20, 4, 5, 23]))
有些folks正在使用带位掩码的dp,如下所示:
dp[i]
为您提供可以组成具有总体验i
的团队的可能数量的玩家的位掩码。要为给定的总体验添加1到每个可能数量的玩家,请向左移动1.要合并两组数字,只需按位OR。
dp[i] |= dp[i-array[j]] << 1
最后答案是dp[sum/2][len(array)/2]
问题:在这两种方法中,我认为时间复杂度是相同的,除了第二种方法,你将获得更好的空间复杂性。正确?