416. Partition Equal Subset Sum

/**
 * Created by haoge-pc on 2017/10/17.
 * 一个非空,全正的整数数组,判断能否划分成两个和相等的子数组
 */
public class Q416PartitionEqualSubsetSum {
    public boolean canPartition(int[] nums) {
        int sum = 0;
        for (int num :
                nums) {
            sum += num;
        }
        if (sum%2 != 0)
            return false;
        sum /= 2;
        Boolean[] dp = new Boolean[sum+1];
        Arrays.fill(dp,false);
        dp[0] = true;
        //遍历从sum到0的每个整数,看是否能由数组中的数组成
        //判断的方式是看i-num是否是true,是的话由于当前有num,所以i可以拼成
        //把num都要检查一遍,所以复杂度是o(sum * n)
        for (int num: nums)
        {
            for (int i = sum; i >= 0; i--) {
                //两种情况说明这个i可以拼成:一种是在前边的检查中已经验证可以拼成了,另一种是这次才验证了可以拼成
                dp[i] = dp[i] || dp[i-num];
            }
        }
        return dp[sum];
    }
}

这个题最重要的一个方法:一个数组判断能不能相加凑出来一个数sum

方法是:判断sum到0的每个整数是否能被拼凑出来

对于每个数组中的数num都进行一次从sum到num的判断

设置一个动态规划的数组,dp[i]记录i能否被凑出来,dp[i] = dp[i] || dp[i-num]

|| 前边你的若是ture则代表这个已经被验证了可以,后边的true说明可以i-num可以,加上本次的数是num,所以i也可以被拼出来

原文地址:https://www.cnblogs.com/stAr-1/p/7683654.html