【leetcode】416. 分割等和子集(0-1背包问题)

本文探讨如何解决分割等和子集问题,通过分析数组元素和,利用01背包思想,实现数组的有效分割。文章提供了详细的算法思路及AC代码,帮助理解如何判断一个数组是否能被分割为两个元素和相等的子集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:

  • 每个数组中的元素不会超过 100
  • 数组的大小不会超过 200
    示例 1:
    输入: [1, 5, 11, 5]
    输出: true
    解释: 数组可以分割成 [1, 5, 5] 和 [11].
    示例 2:
    输入: [1, 2, 3, 5]
    输出: false
    解释: 数组不能分割成两个元素和相等的子集.
    题目链接:416. 分割等和子集(0-1背包)

思路:

  • 若能将数组分成两个元素和相等的子集,则整个数组的元素和sum必定是偶数。求得数组的元素和sum后,每个子集的元素和就确定了,即sum/2。由此问题又可以转化为“是否可以在数组中找到一些元素的和恰好等于sum/2”。很明显,这就是一个01背包问题。只要判断能否用数组中元素凑出sum/2即可。

AC代码

class Solution {
public:
    bool canPartition(vector<int>& nums) {
     int n=nums.size(),sum=0;
     for(int i=0;i<n;i++){
      sum+=nums[i];
      }
      if(sum%2==1) return false;
      int v=sum/2;  
      vector<bool>dp(v+1,false);
      dp[0]=true;
      for(int i=0;i<n;i++)
      for(int j=v;j>=nums[i];j--)
      dp[j]=(dp[j]||dp[j-nums[i]]);
     return dp[v];
    }
};


上一篇博客:【Leetcode】494. 目标和(递归)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值