以下是题目:
给定一个非空的正整数数组 nums
,请判断能否将这些数字分成元素和相等的两部分。
示例 1:
输入:nums = [1,5,11,5] 输出:true 解释:nums 可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5] 输出:false 解释:nums 不可以分为和相等的两部分
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
首先,不要看他是个简单题就以为很简单,实际上本人觉得很难,好吧,可能是现在水题的门槛都变高了吧(手动哭泣~~)
既然看到了这篇文章,想必各位应该考虑过用动态规划了,没错我接下来的代码就是动态规划,先看代码吧:
bool canPartition(vector<int>& nums) {int sums = 0;for (int i : nums)sums += i;if (sums % 2 != 0)return false;sums /= 2;bool dp[nums.size() + 1][sums + 1];memset(dp, false, sizeof(dp)); // 将dp数组初始化为falsefor (int i = 0; i <= nums.size(); i++)dp[i][0] = true; // 初始化第一列为truefor (int i = 1; i <= nums.size(); i++) {for (int j = 1; j <= sums; j++) {if (j - nums[i - 1] < 0) {dp[i][j] = dp[i - 1][j];} else {dp[i][j] = dp[i - 1][j] ||dp[i - 1][j - nums[i - 1]]; // 修正此处的下标}}}return dp[nums.size()][sums]; // 修正返回结果}
题目说是否存在两个子集使得这两个子集和相等,既然这样我们就定义一个sums,把所有的值加起来然后除2,如果是奇数,那肯定是不行的,然后后面的代码都有注释,不懂的再评论区留言吧~