题解 | #分割等和子集#
分割等和子集
https://www.nowcoder.com/practice/65ade309fa4d4067a9add749721bfdc0
n = int(input())
nums = list(map(int, input().split()))
'''
也就是说凑够s//2即可
'''
s = sum(nums)
if s & 1 == 1:
print('false')
else:
dp = [False] * (s//2+1)
dp[0] = True
d = dict()
for i in range(1, len(dp)):
d[i] = 1
for i in range(len(nums)):
t = list(d.keys())
for k in t:
if dp[k-nums[i]]:
dp[k] = True
d.pop(k)
if dp[-1]:
print('true')
else:
print('false')
python 我即使换了True,False的dp最后一组还是超时。。。。
从dp[j] = dp[j] | dp[j-nums[i] 可以看出,当dp[j] 为True时后面迭代的dp[j]一定为True,所以我们只需要关心为False的j就可以了。但这样其实用例太极端的话还是减少不了太多的时间。。。
而且为了方便剔除j,我一开始想用链表做的,结果超时了。。。都是遍历一遍,而且链表还是o1的删除,怎么会超时呢??