原题题目
代码实现(首刷大部分看解小部分自解)
bool canPartition(int* nums, int numsSize){
int sum = 0,i;
for(i=0;i<numsSize;i++)
sum += nums[i];
if(sum%2 || !numsSize)
return false;
int vol = sum/2;
int dp[numsSize][vol+1],j;
memset(dp,0,sizeof(dp));
for(i=0;i<numsSize;i++)
{
if(!i)
{
if(nums[i] <= vol)
dp[i][nums[i]] = 1;
}
else
{
for(j=1;j<=vol;j++)
{
if(dp[i-1][j])
{
dp[i][j] = 1;
if(j+nums[i] <= vol)
dp[i][j+nums[i]] = dp[i][j];
}
}
}
}
if(dp[numsSize-1][vol])
return true;
else
return false;
}
代码实现(DAY 80 双百自解C++)
注意从后向前 防止重叠多数
class Solution {
public:
bool canPartition(vector<int>& nums) {
int size = nums.size(),sum = 0;
for(int i=0;i<size;++i)
sum += nums[i];
if(sum%2 == 1) return false;
sum/=2;
vector<int> dp(sum+1,0);
dp[0] = 1;
for(const auto& num:nums)
{
for(int i=sum;i>=0;--i)
if(dp[i] && i+num<=sum) dp[i+num] = 1;
if(dp[sum]) return true;
}
return false;
}
};
代码实现(DAY 93 三刷C++ 双百自解)
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(const auto& num:nums)
sum+=num;
if(sum%2) return false;
sum/=2;
vector<bool> dp(sum+1,false);
dp[0] = true;
for(const auto& num:nums)
{
for(int i=sum-1;i>=0;--i)
if(dp[i] && i+num<=sum) dp[i+num] = sum;
if(dp[sum]) return true;
}
return false;
}
};