416. 分割等和子集
利用滚动数组的方式进行。
因为要求是分割等和数组,所以设立一个可以容纳一半元素的背包,最后判定背包里放的是不是恰好是一半。
由于是01背包+ 滚动数组的形式,所以遍历顺序肯定是倒序遍历,否则就会重复。
func canPartition(nums []int) bool {
sum := 0
for i := 0; i < len(nums); i++{
sum += nums[i]
}
if sum %2 != 0{
return false
}
sum /= 2
dp := make([]int, sum + 1)
for i := 0; i < len(nums); i++{
for j := sum; j >= nums[i]; j--{
dp[j] = int(math.Max(float64(dp[j]), float64(dp[j - nums[i]] + nums[i])))
}
}
if dp[sum] == sum{
return true
}
return false
}