classSolution { public: boolcanPartition(vector<int>& nums){ int n = nums.size(), sum = 0; bool ans = false; for (int i = 0; i < n; i++) sum += nums[i]; if (sum % 2 == 0) { sort(nums.begin(), nums.end()); ans = dfs(nums, 0, sum / 2); }
return ans; } private: booldfs(vector<int>& nums, int beg, int target){ if (target < 0) returnfalse; if (target == 0) returntrue; bool ans = false; for (int i = beg; i < nums.size(); ++i) { if (nums[i] > target) break; ans = dfs(nums, i + 1, target - nums[i]); if (ans) break; }
classSolution { public: boolcanPartition(vector<int>& nums){ int n = nums.size(), sum = 0; bool ans = false; for (int i = 0; i < n; i++) sum += nums[i]; if (sum % 2 == 0) { int mid = sum / 2; vector<bool> dp(mid + 1, false); dp[0] = true; for (int i = 0; i < n; ++i) { for (int j = mid; j >= nums[i]; --j) dp[j] = dp[j] || dp[j - nums[i]]; if (dp[mid]) { ans = true; break; } } }