题目
给你一个 只包含正整数 的 非空 数组 nums
。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例1
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例2
输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。
提示:
- 1 < = n u m s . l e n g t h < = 200 1 <= nums.length <= 200 1<=nums.length<=200
- 1 < = n u m s [ i ] < = 100 1 <= nums[i] <= 100 1<=nums[i]<=100
代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
//求元素和
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
//背包容纳的重量/体积为:target
int target = sum / 2;
if (sum % 2 == 1) return false;
//物品为数组中所有元素,重量为nums[i],价值为nums[i]
//由于所有元素和最大为20000, 因此取背包容量最大为10000
//dp数组初始化, dp[j]表示:背包总容量是j,最大可以凑成j的子集总和为dp[j]
vector<int> dp(10001, 0);
for (int i = 0; i < nums.size(); i++) { //先对物品遍历
for (int j = target; j >= nums[i]; j--) //再对背包遍历
dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);
}
if (dp[target] == target) return true;
return false;
}
};