416. Partition Equal Subset Sum - jiejackyzhang/leetcode-note GitHub Wiki
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: Both the array size and each of the array element will not exceed 100.
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.
解题思路为dynamic programming。
类似于背包问题。令dp[j]表示能分成sum为j的两部分。则对于第i个数字来说,
dp[j] = dp[j] not include nums[i]
dp[j] = dp[j-nums[i]] include nums[i]
base case为dp[0] = true
public class Solution {
    public boolean canPartition(int[] nums) {
        if(nums == null || nums.length == 0) return true;
        int sum = 0;
        for(int i : nums) {
            sum += i;
        }
        if(sum % 2 != 0) return false;
        int target = sum / 2;
        boolean[] dp = new boolean[target+1];
        dp[0] = true;
        for(int i = 0; i < nums.length; i++) {
            for(int j = target; j >= nums[i]; j--) {
                dp[j] = dp[j] || dp[j-nums[i]];
            }
        }
        return dp[target];
    }
}