def can_partition_array(nums): # Calculate sum of array. array_sum = sum(nums) # If array sum is odd, it cannot be partitioned into equal sum subsets. if array_sum % 2 != 0: return False # Calculate the subset sum. subset_sum = array_sum//2 # Create a lookup table and fill all entries with FALSE. dp = [[False for i in range(len(nums)+1)] for j in range(subset_sum + 1)] # Initialize the first row as TRUE as each array has a subset whose sum is zero for i in range(0, len(nums) + 1): dp[0][i] = True # Fill the lookup table in a bottom-up manner. for i in range(1, subset_sum + 1): for j in range(1, len(nums)+1): if nums[j - 1] > i: dp[i][j] = dp[i][j - 1] else: dp[i][j] = dp[i - nums[j - 1] ][j - 1] or dp[i][j - 1] # Return the last index of the matrix, which is our answer return dp[subset_sum][len(nums)] # Driver code def main(): arr = [[3, 1, 1, 2, 2, 1], [1, 3, 7, 3], [1, 2, 3], [1, 2, 5], [1, 3, 4, 8], [1, 2, 3, 2, 3, 5], [1, 5, 3, 2, 3, 19, 3], [1, 2, 3, 5, 3, 2, 1]] for i in range(len(arr)): print(i + 1, ". Input array: ", arr[i], sep="") result = can_partition_array(arr[i]) print("\nCan we partition the array into equal sum arrays?: ", bool(result), sep="") print("-" * 100) if __name__ == '__main__': main()