一、题目粗心

标签: 动静布局

https://leetcode.cn/problems/partition-equal-subset-sum

给你一个 只蕴含正整数 的 非空 数组 nums 。请你判断是否能够将这个数组宰割成两个子集,使得两个子集的元素和相等。

示例 1:

输出:nums = [1,5,11,5]
输入:true
解释:数组能够宰割成 [1, 5, 5] 和 [11] 。

示例 2:

输出:nums = [1,2,3,5]
输入:false
解释:数组不能宰割成两个元素和相等的子集。

 提醒:

1 <= nums.length <= 200
1 <= nums[i] <= 100

二、解题思路

设所有数字和为sum,咱们的指标是选取一个子数组,使它的总和为sum/2,定义二维boolean数组dpi,其意义是应用前i个数字的和能不能形成整数j。咱们须要把每个地位都进行遍历,同时也要对0-target之间的所有负数进行遍历。状态转移方程是,遍历到i地位时能不能形成target=后面的数字的和能形成target||后面的数字能形成target-nums[i]。这两个状态别离是选不选取nums[i]的两种状况,如果有一种状况成立即可:
dpi = dpi-1 || dpi-1]

三、解题办法

3.1 Java实现

public class Solution {    public boolean canPartition(int[] nums) {        // 数组求和        int sum = Arrays.stream(nums).sum();        // 场景1:和为奇数不能均分        if (sum % 2 == 1) {            return false;        }        int target = sum / 2;        int n = nums.length;        boolean[][] dp = new boolean[n + 1][target + 1];        dp[0][0] = true;        for (int i = 1; i <= n; i++) {            for (int j = 0; j <= target; j++) {                if (j < nums[i - 1]) {                    dp[i][j] = dp[i - 1][j];                } else {                    dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i - 1]];                }            }        }        return dp[n][target];    }}

四、总结小记

  • 2022/6/29 期待7.5号