LeetCode HOT100 - 分割等和子集
要分成两个子集,且它们的和相等
那么我们可以从原数组的总和中得到这两个子集的和是多少
进而问题转成能不能从数组中选取元素使得它们的总和恰好是这个子集和
也就是 01背包问题
class Solution {
public:
bool canPartition(vector<int>& a) {
int sum = accumulate(a.begin(), a.end(), 0);
if (sum % 2) {
return false;
}
sum /= 2;
int n = a.size();
vector<int> dp(sum + 1);
dp[0] = 1;
for (int i : a) {
for (int j = sum; j >= i; j--) {
dp[j] = dp[j] | dp[j - i];
}
}
return dp[sum];
}
};
看别人代码的时候有一个bitset的优化,主要就是这里的元素和不大,因此可以用位元算或者说状态压缩去做

浙公网安备 33010602011771号