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