zoukankan      html  css  js  c++  java
  • 416.分割等和子集-medium

    给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

    注意:

    每个数组中的元素不会超过 100
    数组的大小不会超过 200
    示例 1:

    输入: [1, 5, 11, 5]

    输出: true

    解释: 数组可以分割成 [1, 5, 5] 和 [11].
     

    示例 2:

    输入: [1, 2, 3, 5]

    输出: false

    解释: 数组不能分割成两个元素和相等的子集.

    思路:

      • 动态规划(0-1 背包问题);
      • 对于每一个硬币,可以选择放入或者不放入背包;
      • 详见:LeetCode详解链接

    二维数组空间:

    class Solution {
        public boolean canPartition(int[] nums) {
            int n = nums.length, sum = 0;
            for(int a : nums) sum += a;
            if(sum % 2 == 1) return false; //奇数直接返回fasle
            int weight = sum / 2;
            boolean[][] dp = new boolean[n+1][weight + 1];
            for(int i = 0; i <= n; i++) dp[i][0] = true; //第一列置为 true
            for(int i = 1; i <= n; i++){
                for(int j = 1; j <= weight; j++){
                    if(j >= nums[i-1])
                        dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i-1]]; //对于当前的硬币,选择加入或者不加入
                    else dp[i][j] = dp[i-1][j];
                }
                if(dp[i][weight]) return true; //满足条件,提前结束
            }
            return dp[n][weight];
        }
    }

    一维压缩空间:

    class Solution {
        public boolean canPartition(int[] nums) {
            int n = nums.length, sum = 0;
            for(int a : nums) sum += a;
            if(sum % 2 == 1) return false; //奇数直接返回fasle
            int weight = sum / 2;
            boolean[] dp = new boolean[weight + 1];
            dp[0] = true; //初始置为 true
            for(int i = 1; i <= n; i++){
                for(int j = weight; j > 0; j--){ //从后往前遍历,防止 nums[i] = 1 时,从前往后都为 true
                    if(j >= nums[i-1]) dp[j] = dp[j] || dp[j-nums[i-1]];
                }
                if(dp[weight]) return true; //满足条件,提前结束
            }
            return dp[weight];
        }
    }
  • 相关阅读:
    iOS开发>学无止境
    iOS开发>学无止境
    iOS开发>学无止境
    Objective-C学习—UITableView的使用
    iOS开发>学无止境
    iOS开发—AFNetworking的使用
    iOS开发>学无止境
    c#笔记(六)——数组(2)
    c#笔记(六)——数组
    c#笔记(五)——循环结构
  • 原文地址:https://www.cnblogs.com/luo-c/p/13932597.html
Copyright © 2011-2022 走看看