416.分割等和子集

416.分割等和子集

题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/partition-equal-subset-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

本题求解是否有和为sum/2的子集。

image

1.确定dp数组以及下标的含义
i 表示物品
dp[j] 容量为j的背包,最大可凑成的子集总数为dp[j]

2.确定递推公式
i 是遍历物品,也就是元素 i从0开始代表第0个元素,i从0取到nums.length-1
dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i])

3.dp数组如何初始化
当j=0时,背包容量为0时
这道题的价值都是正数,所以初始化为0就可以了。
如果为价值有负数,那么非0下标就需要初始化为负无穷。

4.确定遍历顺序
先遍历物品从左到右
再遍历背包,因为每个物品只放一次为了防止重复使用物品,则从右到左遍历

for(int i=0;i<len;i++){
	//遍历物品
	for(int j=bagWeight;j>=nums[i];j--){
		dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i])
	}
}

5.举例推导dp数组
nums= [2,1,3]
bagWeight = 3
dp=[0,2,2,3]

image

代码

class Solution {
    public boolean canPartition(int[] nums) {
        int len = nums.length;
        if (len == 1) return false;
        int bagWeight = 0;
        for(int i =0;i<len;i++){
            bagWeight+=nums[i];
        }
        if(bagWeight%2==1) return false; //如果和为奇数,因为数组里只有整数,那么和的一般肯定右小数,是不可能有的
        bagWeight = bagWeight/2;
        int [] dp = new int [bagWeight+1];
        for(int i=0;i<len;i++){
	        for(int j=bagWeight;j>=nums[i];j--){
		        dp[j] = Math.max(dp[j],dp[j-nums[i]]+nums[i]);
               if(dp[j] == bagWeight) return true; //找到了就直接返回
	        }
        }
        return false;
    }
}

这道问题是我学习「背包」问题的入门问题,所以知道这道题用01背包解之后,可以解出来。但是看见这道题第一反应是回溯,并没有看出来用01背包解。

这个是我在题解学习的

背包问题的理解

我们拿到题目如何透过题目的不同包装形式看到里面背包问题的不变内核呢?

给定一个背包容量target,再给定一个数组nums(物品),能否按一定方式选取nums中的元素得到target

注意:
1、背包容量target和物品nums的类型可能是数,也可能是字符串
2、target可能题目已经给出(显式),也可能是需要我们从题目的信息中挖掘出来(非显式)(常见的非显式target比如sum/2等)
3、选取方式有常见的一下几种:每个元素选一次/每个元素选多次/选元素进行排列组合

那么对应的背包问题就是下面我们要讲的背包分类
1、0/1背包问题:每个元素最多选取一次
2、完全背包问题:每个元素可以重复选择
3、组合背包问题:背包中的物品要考虑顺序
4、分组背包问题:不止一个背包,需要遍历每个背包

作者:eh-xing-qing
链接:https://leetcode-cn.com/problems/partition-equal-subset-sum/solution/yi-pian-wen-zhang-chi-tou-bei-bao-wen-ti-a7dd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2021-09-01 16:55  rananie  阅读(137)  评论(0编辑  收藏  举报