状压、折半
class Solution:
def splitArraySameAverage(self, nums):
n = len(nums)
if n < 2:
return False
s = sum(nums)
nums = [nums[i] * n - s for i in range(n)]
mid = n // 2
vis = set()
for i in range(1 << mid):
val = 0
for j in range(mid):
if not i & (1 << j):
val += nums[j]
if val == 0:
return True
vis.add(val)
valr = sum(nums[mid:])
for i in range(1 << (n - mid)):
val = 0
for j in range(mid, n):
if not i & (1 << (j - mid)):
val += nums[j]
if val == 0 or (val != valr and -val in vis):
return True
return False
状压、dfs(超时)
from functools import lru_cache
class Solution:
def splitArraySameAverage(self, nums):
n = len(nums)
s = sum(nums)
@lru_cache(None)
def dfs(pre, val):
num = bin(pre).count('1')
if 0 < num < n and s * num == val * n:
return True
for i in range(n):
if not pre & (1 << i):
if dfs(pre | (1 << i), val + nums[i]):
return True
return False
return dfs(0, 0)