分割等和子集
题目链接:分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
方法一:动态规划+二维数组
class Solution {
public:
bool canPartition(vector<int>& nums) {
vector dp(nums.size() + 1, vector<int> (2e4 + 10, 0));
double sum = 0;
for (auto x : nums) {
sum += x;
}
double target = sum / 2;
for (int i = 0;i < nums.size();i++) {
for (int j = 0;j <= target;j++) {
if (j < nums[i]) {
dp[i+1][j] = dp[i][j];
}else
dp[i + 1][j] = max(dp[i][j], dp[i][j - nums[i]] + nums[i]);
}
}
return dp[nums.size()][target] == target;
}
};方法二:动态规划+一维数组
//一维优化
class Solution {
public:
bool canPartition(vector<int>& nums) {
vector<int> dp(2e4 + 10, 0);
double sum = 0;
for(int i = 0;i < nums.size(); ++i)
sum += nums[i];
double target = double(sum / 2);
for(int i = 0; i < nums.size(); ++i)
for(int j = target;j >= nums[i]; --j)
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
return dp[target] == target;
}
};