基础题¶
分割等和子集¶
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
思路
要使得两个子集的元素和项等,就是求一个子集元素和为 sum/2
,首先想到的是暴力算法,遍历所有可能的子集进行试探,进而想到使用动态规划, sum/2
就是背包容量,数组元素就是物品,我们需要寻找的就是背包装了哪些物品后,刚好装满sum/2
的容量,而且一个元素只能使用一次,所以此问题可以转换为 0-1
背包问题。
五部曲
dp 数组及其下标含义: dp[i][j]代表表使用
0..i
这几个元素,在背包容量为j
时,这些元素和的最大值迭代公式: dp[i][j] = max(dp[i-1][j], dp[i-1]][j-num[i]] + num[i])
dp 数组初始化
遍历顺序
打印 dp 数组