思路:一道简单的01背包的dp,判断背包和为sum/2的背包是否存在。
一维01背包,第一层枚举物品i,第二层从后往前遍历容量sum/2->nums[i],因为小于nums[i]就没意义了,不用考虑,肯定是不存在的。
注意坑点在于当前dp[j]可能已经可以到达了,但是在后续的dp过程中,可能不能由当前dp[j-nums[i]] 进行dp出来,所以需要取异或。
ACcode
class Solution {
public:
bool canPartition(vector<int>& nums) {
int ans = 0;
int bg[50000];
memset(bg,0,sizeof(bg));
bg[0]=1;
int n = nums.size();
if(n<2)return 0;
for(int i = 0 ;i < n;i++){
ans+=nums[i];
}
if(ans%2)return 0;
ans /=2;
for(int i = 0;i < n;i++){
for(int j = ans ;j >= nums[i] ;j--){
bg[j]|=bg[j-nums[i]];//按位或
}
}
if(bg[ans])return 1;
else return 0;
}
};