Leetcode-416-分割等和子集(01背包)
题目链接
题目描述
一个 只包含正整数 的 非空 数组 nums 。
判断是否可以将这个数组分割成两个子集
使得两个子集的元素和相等。
思路
01背包问题
- 若能分成两个和相等的子集,则总和一定是偶数。
- 把总和的一半看作背包的总体积
- 每个元素值,既是价值,又是该元素的体积。
- 若最后,背包最多能装下的体积刚好是总和的一半,则返回true
- 否则返回false
C++代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size(), V = 0;
for (int i = 0; i < n; i++)
V += nums[i];
if (V&1) return false;
V >>= 1;
vector<int> ans(V+1);
for (int i = 0; i < n; i++)
for (int j = V; j>=1; j--)
if (j >= nums[i])
ans[j] = max(ans[j-nums[i]]+nums[i], ans[j]);
if (ans[V] == V)
return true;
return false;
}
};