题目:
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
每个数组中的元素不会超过 100
数组的大小不会超过 200
题解思路:
方法一:二维动态规划+0-1背包
函数代码:
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n=nums.size();
int sum=0;
for(int i=0;i<n;i++)
{
sum+=nums[i];
}
if(sum%2==1)
{
return false;
}
sum=sum/2;
vector<vector<int>>dp(n+1,vector<int>(sum+1,false));
dp[0][0]=true;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=sum;j++)
{
if(j<nums[i-1])
{
dp[i][j]=dp[i-1][j];
}
else
{
dp[i][j]=dp[i-1][j]||dp[i-1][j-nums[i-1]];
}
}
}
return dp[n][sum];
}
};
方法二:一维dp+状态压缩
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n=nums.size();
int sum=0;
for(int i=0;i<n;i++)
{
sum+=nums[i];
}
if(sum%2==1)
{
return false;
}
sum=sum/2;
vector<int>dp(sum+1,false);
dp[0]=true;
for(int i=1;i<=n;i++)
{
for(int j=sum;j>=0;j--)
{
if(j>=nums[i-1])
{
dp[j]=dp[j]||dp[j-nums[i-1]];
}
}
}
return dp[sum];
}
};