day 36 | ● 416. 分割等和子集

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
}

你可能感兴趣的:(数据结构与算法,算法,数据结构)