Partition Equal Subset Sum

http://www.lintcode.com/en/problem/partition-equal-subset-sum/?rand=true

public class Solution {
    /*
     * @param nums: a non-empty array only positive integers
     * @return: true if can partition or false
     */
    public boolean canPartition(int[] nums) {
        // write your code here
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            //            取得所有数的合
            sum += nums[i];
        }
        //        因为全是正数,所以和必为偶数
        if ((sum & 1) != 0) {
            return false;
        }
        //        取得一半,转化为背包问题
        sum /= 2;
        boolean[] dp = new boolean[20000];
        //        dp[i] 表示数字i是否是原数组的任意个子集合之和
        dp[0] = true;
//        一个背包的题目,背包容量为数组中元素和的一半+1,这样只要看是否有元素可以正好填满背包即可.
//             但是每个元素只能用一次,所以在尝试放一个元素的时候还要避免他对尝试放其他位置时对自己的影响.
//        所以在尝试放一个元素到背包的时候需要从容量最大的位置开始,
//          如果(当前位置-当前元素大小)位置可以通过放置之前的元素达到,则当前位置也可以通过放置当前元素正好达到这个位置.状态转移方程为:
//        dp[i] = dp[i] || dp[i - nums[k]];
        for (int i = 0; i < nums.length; i++) {
            for (int j = sum; j >= nums[i]; j--) {
                dp[j] |= dp[j - nums[i]];
            }
        }
        return dp[sum];
    }
}

你可能感兴趣的:(Partition Equal Subset Sum)