分割等和子集
题目链接:https://leetcode-cn.com/problems/partition-equal-subset-sum/submissions/
题目描述:
题解:
解题参考链接:
动态规划:关于01背包问题,你该了解这些!
动态规划:关于01背包问题,你该了解这些!(滚动数组)
动态规划:分割等和子集可以用01背包!
该题可以转换为0-1背包问题。
1.nums的元素-》物品重量
2.nums总和的一半-》背包重量限额
3.nums的元素-》物品价值
dp[j]:容量为j的背包,所背物品的最大价值为dp[j]。背包正好装满意味着找到了总和为 sum / 2 的子集。
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int &item : nums)
{
sum += item;
}
if(sum % 2 != 0)
return false;
int target = sum / 2;
//dp[j]:容量为j的背包,所背物品的最大价值为dp[j]
vector<int> dp(10001, 0); //nums最大总和不超过20000
for(int i = 1; i < nums.size(); i++)
{
for(int j = target; j >= nums[i]; j--)
{
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
if(dp[target] == target)
return true;
else
return false;
}
};