原题地址(中等)
又是可恶的动规!!
开始我想用回溯遍历,再加一丢丢减枝,结果还是超出时间限制。
没想到这题是0-1背包的变种。
直接看了官方题解。
代码
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size();
if(n == 0) return true;
int sum = accumulate(nums.begin(), nums.end(), 0);
if(sum % 2 != 0) return false;
int target = sum / 2;
int maxVal = *( max_element(nums.begin(), nums.end()) );
if(maxVal > target) return false;
vector<int> dp(target + 1, 0);
dp[0] = 1;
for(int i=0; i < n; i++) {
int num = nums[i];
for(int j = target; j >= num; j--) {
dp[j] |= dp[j-num];
}
}
return dp[target];
}
};