本文主要是介绍dp题目-分割等和子集(不会有人能想到这能用动态规划做吧)(套01背包问题),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
参考:代码随想录-416. 分割等和子集
题目:
题目难易:中等
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意: 每个数组中的元素不会超过 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背包问题的题目会明确表示物品的数量,体积,价值,以及要求我们所求何值。既然这道题能套01背包问题,那么所给的数组是如何体现物品的数量,体积,价值?题目所给的数组,比如4个元素[1, 5, 11, 5]可以看做 4个物品,体积是[1, 5, 11, 5]价值也是[1, 5, 11, 5]。题目对我们的的要求是求集合里能否出现总和为 sum / 2 的子集。(总和可以理解为总价值)
确定了如下四点,才能把01背包问题套到本题上来。
- 背包的体积为sum / 2
- 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
- 背包如何正好装满,说明找到了总和为 sum / 2 的子集。(dp[j]==j也就是装满了,j为容量也为此时背包的最大值【毕竟装满了】,这一点非常关键)
- 背包中每一个元素是不可重复放入。
- 01背包中,dp[i] 表示: 容量为j的背包,所背的物品价值可以最大为dp[j]。套到本题,dp[i]表示 背包总容量是i,最大可以凑成i的子集总和为dp[i]。
- 为什么dp[i]的数值一定是小于等于i的?首先明白dp[i]的含义:dp[i]表示 背包总容量是i,最大可以凑成i的子集总和为dp[i]。 而且本题中物品的体积和价值一样的,也就是说体积:价值=1:1,如果想装下100价值,那么背包体积必须大于等于100价值,也就是dp[x>=100]=100;
这篇关于dp题目-分割等和子集(不会有人能想到这能用动态规划做吧)(套01背包问题)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!