力扣-416-分割等和子集

最好用dp做,dfs会超时

package LeetCode;
/*
 *    dp动态规划
 *    dp前先处理一下,对于下述两种情况直接判false
 *    dp[i][j]表示下标在0..i之间的元素值之和是否等于j
 */
public class LeetCode416 {
    public static void main(String[] args) {
        int[] nums = {1,5,11,5};
        boolean res = canPartition(nums);
        System.out.println(res);
    }
    
    public static boolean canPartition(int[] nums) {
        int sum = 0, maxNum = -1;
        for(int i = 0; i < nums.length; i++) {
            sum += nums[i];
            maxNum = Math.max(maxNum, nums[i]);
        }
        if(sum % 2 == 1) return false;    
        
        int target = sum/2;
        if(maxNum > target) return false;
        
        boolean[][] dp = new boolean[nums.length][target + 1];    //dp[i][j]表示下标在0..i之间的值之和是否等于j
        
        for(int i = 0; i < nums.length; i++) {
            dp[i][0] = true;
        }
        dp[0][nums[0]] = true;    //其余的dp[0][:]都是false
        
        for(int i = 1; i < nums.length; i++) {
            for(int j = 0; j <= target; j++) {
                if(j >= nums[i]) {
                    dp[i][j] = dp[i-1][j] | dp[i-1][j-nums[i]];
                }else {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[nums.length-1][target];
    }
}

 

posted @ 2020-10-19 15:47  Peterxiazhen  阅读(115)  评论(0编辑  收藏  举报