一、题目粗心
标签: 动静布局
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号