这题看着挺费劲的,但其实是需要一定的转换,即首先,数组的和一定是个偶数,而我们要找一个子数组,看能不能等于这个数组和的一半,所以,就变成了一个简单的背包装满问题。
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(auto num: nums)sum += num;
if(sum&1)return false;
sum /= 2;
int dp[sum+1];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for(auto num: nums)
{
for(int i=sum;i>=num;i--)
{
if(dp[i-num] == 1)dp[i] = 1;
}
}
return dp[sum];
}
};