首页 > 其他分享 >力扣leetcode 416.分割等和子集 动态规划 0-1背包

力扣leetcode 416.分割等和子集 动态规划 0-1背包

时间:2025-01-13 16:30:05浏览次数:3  
标签:背包 target nums int 力扣 416 数组 leetcode dp

题目:

给你一个 只包含正整数 的 非空 数组 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

思路:

  • 该题可简化为0-1背包问题。
  • 关于动态规划的步骤,可以去看b站:代码随想录的视频
  • 本题我参照代码随想录的五部曲步骤,练习0-1背包代码。
  • 首先需要得出数组所有元素的和。
  • 背包容量即为元素和的一半。
  • 物品即为元素,物品的重量和价值均为它的值。

C代码:

/*
动态规划明确步骤(0-1背包问题):
1.dp数组定义以及下标的含义:dp[j]为背包容量为j时,能放入的元素的最大值
2.得出递归公式:max(dp[j], dp[j - nums[i] + nums[i])
3.dp数组初始化为何值:0
4.明确遍历顺序:先遍历物品,再后序遍历背包
5.debug方法:打印dp数组查看
*/
#define MAX(a, b) (((a) > (b)) ? (a) : (b))

bool canPartition(int* nums, int numsSize) {
    int sum = 0;
    for(int i = 0; i < numsSize; i++) {
        sum += nums[i];
    }
    if(sum % 2) return false; // 和为奇数则不可能分割成两个元素和相等的子集
    int target = sum / 2;
    int dp[target + 1];
    memset(dp, 0, (target + 1) * sizeof(int));
    for(int i = 0; i < numsSize; i++) {
        for(int j = target; j >= nums[i]; j--) {
            dp[j] = MAX(dp[j], dp[j - nums[i]] + nums[i]);
        }
    }
    return dp[target] == target;
}

标签:背包,target,nums,int,力扣,416,数组,leetcode,dp
From: https://blog.csdn.net/chamao_/article/details/145118465

相关文章

  • LeetCode热题100-两数相加【JavaScript讲解】
    题目:题解:根据题目(2->4->3)+(5->6->4)=(7->0->8),根据加法的计算过程我们知道首先从低位开始算起,也就是说应该先计算2+5=7;4+6=10,向前进一位,此处取余数0;3+4+进一位的1=8;所以答案是7->0->8。最关键的是最后的进位一定要记得,如果最后相加的和需要进位!!!解题代码:/***......
  • LeetCode100之分割回文串(131)--Java
    1.问题描述        给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。        示例1输入:s="aab"输出:[["a","a","b"],["aa","b"]]    示例2 输入:s="a"输出:[["a"]]        提......
  • LeetCode 2275: 按位与结果大于零的最长组合题解
    LeetCode2275:按位与结果大于零的最长组合题解1.题目分析这道题目考察了位运算的基本概念和应用。我们需要在给定的数组中找出最长的子序列,使得这些数字进行按位与运算后的结果大于0。1.1关键概念按位与运算(&)两个二进制位都为1时,结果为1。只要有一个为0,结果就为0......
  • LeetCode:65.有效数字
    LeetCode:65.有效数字解题步骤构建一个表示状态的图。遍历字符串,并沿着图走,如果到了某个节点无路可走就返false。遍历结束,如走到3/5/6,就返回true,否则返回false。extend281016进制/***检查一个字符串是否可以表示为一个有效的数字*@param{string}s-待检查的字......
  • 力扣-数组-219 存在重复元素Ⅱ
    解析同上一篇《力扣-数组-217存在重复元素》存储在重复元素的思路,重点是放在结构体里,保存之前的下标即可。代码classSolution{public:structmyNode{intindex;intvalue;};staticboolcmp(myNodea,myNodeb){return......
  • leetcode2902 和带限制的子多重集合的数目
    给定数组nums[n]和整数l,r,nums中的元素可能会重复,要求从nums中选择若干个元素,其元素和在[l,r]内,有多少种不同方案,结果对1E9+7取模。注:空集合的结果为0,相等的元素之间没有区别。1<=n<=2E4;0<=nums[i]<=2E4;sum(nums[i])<=2E4;0<=l<=r<=2E4分析:1、存在相等元素,且没有区别,可以......
  • LeetCode:112.路径总和
    LeetCode:112.路径总和解题思路在深度优先遍历的过程中,记录当前路径的节点值的和。在叶子节点处,判断当前路径的节点值的和是否等于目标值。解题步骤深度优先遍历二叉树,在叶子节点处,判断当前路径的节点值的和是否等于目标值,是就返回true。遍历结束,如果没有匹配,就返回false。varh......
  • LeetCode:102.二叉树的层序遍历
    LeetCode:102.二叉树的层序遍历解题思路层序遍历顺序就是广度优先遍历。不过在遍历时候需要记录当前节点所处的层级,方便将其添加到不同的数组中。/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*this.val=(val===undefined?0:......
  • leetcode3333 找到初始输入字符串II
    用键盘输入字符时,可能因为在一个键上停留太久,导致同一个字符被输入多次。给定word表示最终显示的字符串,以及整数k,表示希望输入字符串的最少长度,求希望输入串的总方案数,对1E9+7取模。1<=|word|<=5E5;1<=k<=2000;word只包含小写字母分析:1、假设最终串的长度为n,对其分组循环,把相......
  • LeetCode:111.二叉树的最小深度
    LeetCode:111.二叉树的最小深度解题思路求最小深度,考虑使用广度优先遍历。在广度优先遍历过程中,遇到叶子节点,停止遍历,返回节点层级。解题步骤广度优先遍历整棵树,并记录每个节点的层级。遇到叶子节点,返回节点层级,停止遍历。//dfsvarminDepth=function(root){if(!root......