方法一 01背包
本题实际含义为求数组子序列中是否存在和为mid的情况
01背包,一次放一个计算,本题比较妙的解法见方法二
class Solution {
public:
bool canPartition(vector<int>& nums) {
int mid=0,maxv=0;
for(int i=0;i<nums.size();i++)
{
mid+=nums[i];
maxv=max(maxv,nums[i]);
}
if(mid%2==1)return false;
mid/=2;
if(maxv>mid)return false;
vector<int>f(mid+1,0);
f[0]=1;
for(auto x:nums)
for(int i=mid;i>=x;i--)
f[i]=f[i-x]|f[i];
return f[mid];
}
};
方法二 bitset应用
class Solution {
public:
bool canPartition(vector<int>& nums) {
int mid=0,maxv=0;
for(int i=0;i<nums.size();i++)
{
mid+=nums[i];
maxv=max(maxv,nums[i]);
}
if(mid%2==1)return false;
mid/=2;
if(maxv>mid)return false;
bitset<10001>f;
f[0]=1;
for(auto x:nums)
f=(f<<x)|f;
return f[mid];
}
};