[力扣c++实现] 416. 分割等和子集

416. 分割等和子集

难度中等1130收藏分享切换为英文接收动态反馈

给你一个 只包含正整数非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:

输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:

  • 1 <= nums.length <= 200

  • 1 <= nums[i] <= 100

1.c++

/* 
 *  @date:     2022-02-12
 *  @autor:    zhangyb  
 *  @city:     hangzhou
 *  @accept date:  2022-02-12
 */
#include 
#include 
#include 
#include 

using namespace std;

class Solution {
public:
    bool canPartition(vector& nums) {
        int size = nums.size();
        if (size <= 1)
        {
            return false;
        }
        
        int ret = 0;
        for (auto& number:nums)
        {
            ret += number;
        }
		
        //均分的必要条件是和为偶数
        if ((ret&0x1) != 0)
        {
            return false;
        }

        int half_sum = ret>>1;
        vector dp(half_sum+1,0);

        dp[0] = 1;//背包装的东西重量为0,只有1种方式
        for (int num:nums)
        {
            for (int i = half_sum; i >= num;--i)//这里i=half_sum,同时也假定了,当前重量为i的情形可能不存在(==0),也可能存在。
            {
                dp[i] = dp[i] || dp[i-num];
            }
        } 

        return dp[half_sum];
    }
};

int main()
{
  Solution slu;

#if 0
  vector nums = {1,2,3,5,91,23,1,2,23,45,5,78,21,12,24,4,34,12,6,7,67};
#endif 

  vector nums = {100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,99,97};
  std::cout << (slu.canPartition(nums) == true?"True":"False") << std::endl;
}

你可能感兴趣的:(力扣算法题练手,leetcode,c++,算法)