416
题目:
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
题目链接:416. 分割等和子集 - 力扣(LeetCode)
思路:
想象成01背包,重量和值都是数组的值,二维比较好使用。
代码:
class Solution {
public boolean canPartition(int[] nums) {
int len = nums.length;
int sum = 0;
for (int num : nums)
sum += num;
if(sum % 2 == 1)
return false;
int target = sum / 2;
int[][] dp = new int[nums.length][target + 1];
for(int j = nums[0]; j <= target; j++){
dp[0][j] = nums[0];
}
for(int i = 1; i < len; i++){
for(int j = 0; j <= target; j++){
if (j < nums[i])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);
}
}
return dp[len - 1][target] == target;
}
}
随想录代码
该篇文章介绍了如何使用二维动态规划解决LeetCode问题416,判断给定正整数数组是否可以分成两个和相等的子集。通过模拟01背包问题,计算每个状态下的最大价值,最终判断目标和是否存在

405

被折叠的 条评论
为什么被折叠?



