def canPartition(nums: List[int]) -> bool:
sums = sum(nums)
if sums % 2 == 1:
return(False)
# knapstack without repetition: find a sequence that sums to (sums / 2)
sums /= 2
knap = [[True] + [False for _ in range(int(sums))] for _ in range(2)]
for x in nums:
for i in range(x, len(knap[0])):
knap[1][i] = knap[0][i] or knap[0][i-x]
knap[0] = knap[1][:]
return(knap[0][-1])