网站模板怎么修改教程,重庆九龙坡营销型网站建设公司哪家好,岱山县建设局网站,公司网站怎么弄题目 
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集#xff0c;使得两个子集的元素和相等。 
示例 1#xff1a; 
输入#xff1a;nums  [1,5,11,5]
输出#xff1a;true
解释#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 
示…题目 
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集使得两个子集的元素和相等。 
示例 1 
输入nums  [1,5,11,5]
输出true
解释数组可以分割成 [1, 5, 5] 和 [11] 。 
示例 2 
输入nums  [1,2,3,5]
输出false
解释数组不能分割成两个元素和相等的子集。提示 
1  nums.length  2001  nums[i]  100 解答 
源代码 
class Solution {public boolean canPartition(int[] nums) {if (nums.length  2) {return false;}int sum  0, max  0;for (int num : nums) {sum  num;max  Math.max(max, num);}if (sum % 2  1) {return false;}if (max  sum / 2) {return false;}boolean[][] dp  new boolean[nums.length][sum / 2  1];dp[0][nums[0]]  true;for (int i  0; i  nums.length; i) {dp[i][0]  true;}for (int i  1; i  nums.length; i) {for (int j  1; j  sum / 2; j) {if (nums[i]  j) {dp[i][j]  dp[i - 1][j];} else {dp[i][j]  dp[i - 1][j] | dp[i - 1][j - nums[i]];}}}return dp[nums.length - 1][sum / 2];}
} 
总结 
实际上是求能否从背包里选取元素使这些元素之和等于数组所有元素之和的一半。dp[i][j]表示数组{0…i}中能否选出和为j的元素。 
优化空间复杂度的算法也看了勉强理解了但是自己写应该还想不到这样优化。