原题地址(中等)

又是可恶的动规!!

开始我想用回溯遍历,再加一丢丢减枝,结果还是超出时间限制。

没想到这题是0-1背包的变种。

直接看了官方题解。

代码

  1. class Solution {
  2. public:
  3. bool canPartition(vector<int>& nums) {
  4. int n = nums.size();
  5. if(n == 0) return true;
  6. int sum = accumulate(nums.begin(), nums.end(), 0);
  7. if(sum % 2 != 0) return false;
  8. int target = sum / 2;
  9. int maxVal = *( max_element(nums.begin(), nums.end()) );
  10. if(maxVal > target) return false;
  11. vector<int> dp(target + 1, 0);
  12. dp[0] = 1;
  13. for(int i=0; i < n; i++) {
  14. int num = nums[i];
  15. for(int j = target; j >= num; j--) {
  16. dp[j] |= dp[j-num];
  17. }
  18. }
  19. return dp[target];
  20. }
  21. };