给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200
示例 1: 输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2: 输入: [1, 2, 3, 5] 输出: false 解释: 数组不能分割成两个元素和相等的子集.
提示:
- 1 <= nums.length <= 200
- 1 <= nums[i] <= 100
这题的本质是一道01背包问题
明确以下问题:
1、背包的体积为sum/2
2、背包要放入的物品相当于集合中的元素,每个元素只能放一次,每个元素对于的数值为物品的重量,也是物品的价值
3、背包正好装满,说明找到了总和为sum/2的子集
动态规划五部曲:
1、确定dp数组及其下标含义
01背包中,dp[j]表示容量为j的背包,所背物品价值的最大为dp[J]
本题:dp[j]表示表示总容量为j,最大可以凑成j的子集总和为dp[j]
2、递推公式:
01背包的递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
本题:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])
3、dp数组初始化
在01背包,一维dp如何初始化,已经讲过,
从dp[j]的定义来看,首先dp[0]一定是