动态规划(01背包问题)
【dp
数组含义】:容量(和)为j
的情况下,能达到的最大容量(和)dp[j]
【状态转移方程】:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
最后判断dp[halfSum]
是否等于halfSum
即可
class Solution {
public:
bool canPartition(vector<int>& nums) {
int size = nums.size();
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % 2 != 0) return false;
int halfSum = sum / 2;
vector<int> dp(halfSum + 1, 0);
for (int i = 0; i < size; i++)
for (int j = halfSum; j >= nums[i]; j--)
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
return dp[halfSum] == halfSum;
}
};
【dp
数组含义】:容量(和)为j
的情况下,能否恰好装满
【状态转移方程】:dp[j] = dp[j] || dp[j - nums[i]]
class Solution {
public:
bool canPartition(vector<int>& nums) {
int size = nums.size();
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum % 2 != 0) return false;
sum /= 2;
vector<bool> dp(sum + 1, false);
dp[0] = true;
for (int i = 0; i < size; i++)
for (int j = sum; j >= nums[i]; j--) {
dp[j] = dp[j] || dp[j - nums[i]];
}
return dp[sum];
}
};
致谢
图片来源于「代码随想录」公众号,欢迎大家关注这位大佬的公号