class Solution:
def canPartition(self, nums: List[int]) -> bool:
# time O(N*_sum) space time O(N*_sum)
# step1: check if posibble to equal
_sum = sum(nums)
size = len(nums)
if _sum%2 != 0 :
return False
avg = _sum//2
# dp[i][j]: first i numbers can be summed up to j
dp = [[False for _ in range(avg+1)] for x in range(size+1)]
# step2: initialize base case
for i in range(size+1):
dp[i][0] = True
# step3: state transition
for i in range(1,size+1):
for j in range(1,avg+1):
# step3.1: when current weight has remaining, can choose to pick nums[i-1] or not to pick
if j -nums[i-1] >= 0:
dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i-1]]
# step3.2 when current weight has not remaining, can only choose not to pick nums[i-1]
else:
dp[i][j] = dp[i-1][j]
# step4 return status when choose first size items and to turn into avg (sum)
return dp[size][avg]
Optimization: Space Compression
class Solution:
def canPartition(self, nums: List[int]) -> bool:
# time O(N*_sum) space time O(_sum)
# step1: check if posibble to equal
_sum = sum(nums)
size = len(nums)
if _sum%2 != 0 :
return False
avg = _sum//2
# dp[j]: can subset be summed up to j weight
dp = [False for _ in range(avg+1)]
# step2: initialize base case
dp[0] = True
# step3: state transition
for i in range(1,size+1):
# !! note j can only in reverse order to avoid overwritten updated state
for j in range(avg,-1,-1):
# step3.1: when current weight has remaining, can choose to pick nums[i-1] or not to pick
if j -nums[i-1] >= 0:
dp[j] = dp[j] or dp[j-nums[i-1]]
#print(i,j,dp)
# step4 return if subset can be found to turn into avg (sum)
#print(dp)
return dp[avg]
to Better understand each steps state change: i j dp[0:avg+1] 1 11[True, False, False, False, False, False, False, False, False, False, False, False] 1 10[True, False, False, False, False, False, False, False, False, False, False, False] 1 9 [True, False, False, False, False, False, False, False, False, False, False, False] 1 8 [True, False, False, False, False, False, False, False, False, False, False, False] 1 7 [True, False, False, False, False, False, False, False, False, False, False, False] 1 6 [True, False, False, False, False, False, False, False, False, False, False, False] 1 5 [True, False, False, False, False, False, False, False, False, False, False, False] 1 4 [True, False, False, False, False, False, False, False, False, False, False, False] 1 3 [True, False, False, False, False, False, False, False, False, False, False, False] 1 2 [True, False, False, False, False, False, False, False, False, False, False, False] 1 1 [True, True, False, False, False, False, False, False, False, False, False, False] 1 0 [True, True, False, False, False, False, False, False, False, False, False, False] 2 11[True, True, False, False, False, False, False, False, False, False, False, False] 2 10[True, True, False, False, False, False, False, False, False, False, False, False] 2 9 [True, True, False, False, False, False, False, False, False, False, False, False] 2 8 [True, True, False, False, False, False, False, False, False, False, False, False] 2 7 [True, True, False, False, False, False, False, False, False, False, False, False] 2 6 [True, True, False, False, False, False, True, False, False, False, False, False] 2 5 [True, True, False, False, False, True, True, False, False, False, False, False] 2 4 [True, True, False, False, False, True, True, False, False, False, False, False] 2 3 [True, True, False, False, False, True, True, False, False, False, False, False] 2 2 [True, True, False, False, False, True, True, False, False, False, False, False] 2 1 [True, True, False, False, False, True, True, False, False, False, False, False] 2 0 [True, True, False, False, False, True, True, False, False, False, False, False] 3 11[True, True, False, False, False, True, True, False, False, False, False, True] 3 10[True, True, False, False, False, True, True, False, False, False, False, True] 3 9 [True, True, False, False, False, True, True, False, False, False, False, True] 3 8 [True, True, False, False, False, True, True, False, False, False, False, True] 3 7 [True, True, False, False, False, True, True, False, False, False, False, True] 3 6 [True, True, False, False, False, True, True, False, False, False, False, True] 3 5 [True, True, False, False, False, True, True, False, False, False, False, True] 3 4 [True, True, False, False, False, True, True, False, False, False, False, True] 3 3 [True, True, False, False, False, True, True, False, False, False, False, True] 3 2 [True, True, False, False, False, True, True, False, False, False, False, True] 3 1 [True, True, False, False, False, True, True, False, False, False, False, True] 3 0 [True, True, False, False, False, True, True, False, False, False, False, True] 4 11[True, True, False, False, False, True, True, False, False, False, False, True] 4 10[True, True, False, False, False, True, True, False, False, False, True, True] 4 9 [True, True, False, False, False, True, True, False, False, False, True, True] 4 8 [True, True, False, False, False, True, True, False, False, False, True, True] 4 7 [True, True, False, False, False, True, True, False, False, False, True, True] 4 6 [True, True, False, False, False, True, True, False, False, False, True, True] 4 5 [True, True, False, False, False, True, True, False, False, False, True, True] 4 4 [True, True, False, False, False, True, True, False, False, False, True, True] 4 3 [True, True, False, False, False, True, True, False, False, False, True, True] 4 2 [True, True, False, False, False, True, True, False, False, False, True, True] 4 1 [True, True, False, False, False, True, True, False, False, False, True, True] 4 0 [True, True, False, False, False, True, True, False, False, False, True, True]