力扣https://leetcode-cn.com/problems/partition-equal-subset-sum/
题目描述
题目分析
这道题其实用暴力也能做,回溯来实现,但是时间复杂度太高,AC不了;还是dp来做比较合适,这道题其实可以转化为01背包来做,背包的容量为所有数字和的一半,如果把背包装满了,那么返回true,否则false;在开始之前来个判断,如果数组所有元素之和是奇数,那么一定返回false;
C++实现
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
vector<int> dp(10001,0);
for(int i = 0; i < nums.size(); i++){
sum += nums[i];
}
if(sum % 2 == 1) return false;
int target = sum / 2;
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;
}
};