> 文档中心 > 【从0到1冲刺蓝桥杯国赛】每日一练——分割等和子集

【从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;    }};