Problem Statement
(Source) Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.
Note:
- Each of the array element will not exceed 100.
- The array size will not exceed 200.
Example 1:
Input: [1, 5, 11, 5] Output: true Explanation: The array can be partitioned as [1, 5, 5] and [11].
Example 2:
Input: [1, 2, 3, 5] Output: false Explanation: The array cannot be partitioned into equal sum subsets.
Solution
There exists various solutions for this question, of which a decent one is using DFS
. As we can know easily, if the sum of the input array is odd, it cannot be partitioned into two subsets with equal subset sum. If the sum of the input array is even, then the main idea to solve this problem is as follows:
- Set a variable
target
as the target we aim to achieve. - Choose from the array
nums
an element one by one and see the remaining elements starting from the current chosen position can make us achievetarget - nums[i]
as the new target. The reason that we can just consider the remaining elements is a form of pruning (eliminating redundant computation ). To make thing faster, we can sortnums
at the beginning in descending order.
class Solution(object):
def canPartition(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
nums.sort(reverse=True)
def helper(start, target):
if target < 0:
return
elif target == 0:
return True
else:
return any(helper(i + 1, target - nums[i]) for i in xrange(start, len(nums)))
return False if sum(nums) % 2 else helper(0, sum(nums) >> 1)
TODO
Try to solve it using Dynamic Programming
.