难度中等1130收藏分享切换为英文接收动态反馈
给你一个 只包含正整数 的 非空 数组 nums
。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
/*
* @date: 2022-02-12
* @autor: zhangyb
* @city: hangzhou
* @accept date: 2022-02-12
*/
#include
#include
#include
#include
using namespace std;
class Solution {
public:
bool canPartition(vector& nums) {
int size = nums.size();
if (size <= 1)
{
return false;
}
int ret = 0;
for (auto& number:nums)
{
ret += number;
}
//均分的必要条件是和为偶数
if ((ret&0x1) != 0)
{
return false;
}
int half_sum = ret>>1;
vector dp(half_sum+1,0);
dp[0] = 1;//背包装的东西重量为0,只有1种方式
for (int num:nums)
{
for (int i = half_sum; i >= num;--i)//这里i=half_sum,同时也假定了,当前重量为i的情形可能不存在(==0),也可能存在。
{
dp[i] = dp[i] || dp[i-num];
}
}
return dp[half_sum];
}
};
int main()
{
Solution slu;
#if 0
vector nums = {1,2,3,5,91,23,1,2,23,45,5,78,21,12,24,4,34,12,6,7,67};
#endif
vector nums = {100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,99,97};
std::cout << (slu.canPartition(nums) == true?"True":"False") << std::endl;
}