子集和可以在具有相等元素的两组中整除

时间:2017-10-23 01:34:00

标签: python algorithm dynamic-programming subset-sum

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]

问题:在这两种方法中,我认为时间复杂度是相同的,除了第二种方法,你将获得更好的空间复杂性。正确?

0 个答案:

没有答案