动态规划分析:
这是一个子集背包问题。想要知道有没有两个相等的子集,可以把问题分割成有没有一个子集的和等于整个数组和的一半。所以这样就可以转化成一个背包问题。
一、对dp数组进行定义:对于前i个数,是否存在子集的和等于j,如果存在,那么dp[i][j] = true,如果不存在,dp[i][j] = false。
二、base case:当i为0时,没有数给我们做子集,这时不可能凑出j。当j为0时,任何时候都满足,因为任何时候背包都是空的。
三、状态转移方程:对于dp[i][j] 有两种选择,一种是放,一种是不放。如果放了,只要看看放之前的dp[i-1][j-nums[i-1]]可不可以凑出,如果可以凑出,那么放了之后加上nums[i-1]时是必可以凑出的。如果不放,跟上一个状态没什么区别,就是i多了一个,dp[i][j] = dp[i-1][j]。
leetcode.416 分割等和子集(Medium)
最新推荐文章于 2024-06-16 20:54:56 发布