三个数组,各能不能分成两半
"划分问题":能不能把一个数组分成两堆,两堆的和相等?三个数组 [17, 24, 15, 13, 23]、[10, 20, 15, 5]、[17, 24, 15, 13, 23, 3] 各判一次。注意 can_split 一行新算法都没写,只是把输入交给了 subset_sum:
NO = [17, 24, 15, 13, 23]
YES = [10, 20, 15, 5]
ODD = [17, 24, 15, 13, 23, 3]
def subset_sum(arr, target):
"""老朋友:能不能挑出一个子集,和正好等于 target"""
reach = {0}
for x in arr:
reach |= {r + x for r in reach}
return target in reach
def can_split(arr):
s = sum(arr)
if s % 2 == 1:
return False
return subset_sum(arr, s // 2)
print("/".join("能" if can_split(x) else "不能" for x in (NO, YES, ODD)))
全部评论