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

力扣https://leetcode-cn.com/problems/partition-equal-subset-sum/

【从0到1冲刺蓝桥杯国赛】每日一练——分割等和子集_第1张图片

题目描述 

【从0到1冲刺蓝桥杯国赛】每日一练——分割等和子集_第2张图片

题目分析 

这道题其实用暴力也能做,回溯来实现,但是时间复杂度太高,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.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;
    }
};

你可能感兴趣的:(蓝桥杯备战,蓝桥杯,数据结构,算法,动态规划)