欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【leetcode】—416.分割等和子集

【leetcode】—416.分割等和子集

2025/6/7 5:37:31 来源:https://blog.csdn.net/m0_74014989/article/details/147048582  浏览:    关键词:【leetcode】—416.分割等和子集

image-20250326184105719

✏️ 关于专栏:专栏用于记录 LeetCode 中做题与总结

文章目录

      • 分割等和子集
        • ▐ 题目描述
        • ▐ 题目示例
        • ▐ 题目提示
        • ▐ 思路&代码
          • 方法:动态规划

分割等和子集

▐ 题目描述

题目链接:分割等和子集

给你一个 只包含正整数非空 数组 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
▐ 思路&代码
方法:动态规划

思路:我们可以把这个问题转化为一个子集和问题

  • 设数组总和为 s u m sum sum,若是 s u m sum sum奇数,则不可能分成两个相等的子集,直接返回 f a l s e false false

  • 若是偶数,目标是找出一个子集,它的元素和为 s u m / 2 sum/2 sum/2

  • 如果 n u m s nums nums中最大的元素 m a x _ e l e m e n t max\_element max_element是大于 s u m / 2 sum/2 sum/2​​,则不可能分成两个相等的子集,直接返回 f a l s e false false

我们使用一个 布尔型数组 d p dp dp,它的索引表示某个子集和的目标值,值为 true 表示当前和是可能的,值为 f a l s e false false表示当前和是不可达的。

d p dp dp含义:

d p [ i ] dp[i] dp[i]表示是否存在子集,其和为 i i i.

d p dp dp初始化:

d p [ 0 ] = t r u e dp[0] = true dp[0]=true

(不选取任何元素)

d p dp dp​状态转移方程:

状态定义:

  • dp[j] 表示是否可以通过选取一些元素使得它们的和为 j
    • 初始状态:dp[0] = true,表示和为 0 的子集总是可能的(即不选择任何元素)。
    • 其他 dp[j] 初始化为 false,表示当前我们还不能形成和为 j 的子集。

状态转移:

对于每个元素 num,我们尝试更新 dp 数组。如果我们能通过之前的某些数字组合成和为 j - num 的子集,那么加上当前数字 num 就可以组成和为 j 的子集。

image-20250407170633118

Example:

image-20250407171605778

代码:

class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for (int num : nums) {sum += num;}// 如果总和是奇数,则不可能划分成两个相等子集if (sum % 2 != 0) return false;int target = sum / 2;int maxElement = *max_element(nums.begin(),nums.end());if(maxElement > target) return false;// 定义一维dp数组,dp[i]表示是否存在子集,其和为ivector<bool> dp(target + 1, false);dp[0] = true; // 和为0总是可以实现的(不选任何元素)// 遍历每个数for (int num : nums) {// 必须从大到小遍历,防止一个数被重复使用for (int j = target; j >= num; --j) {dp[j] = dp[j] || dp[j - num];}}return dp[target]; // 是否能组成target这个和}
};

d1fded34d21c16a44c687a112865ab0

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词