分割等和子集

问题

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例

示例 1:

输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

思想

 动态规划:如果数组元素和为单数不可能存在和相等的俩个子集,将总和的一半设为target。如果能找到一个子集的和为target,则剩余元素的和也为target,检查数组中的最大值。如果最大值超过target,则无法找到这样的子集。使用动态规划数组dp,其中dp[j]表示是否存在子集的和为j。通过遍历数组元素,逆向更新dp数组,避免重复使用元素,最终检查dp[target]是否为true

代码

func canPartition(nums []int) bool {
    totalSum := 0
    for _,num := range nums {
        totalSum += num
    }
    if totalSum % 2 !=0 {
        return false
    }
    target := totalSum / 2
    maxNum := 0
    for _,num := range nums {
        if num > maxNum {
            maxNum = num
        }
    }
    if maxNum > target {
        return false
    }
    dp := make([]bool, target + 1)
    dp[0] = true
    for i := 0; i < len(nums); i++ {
        for j := target; j>=nums[i];j--{
            if dp[j-nums[i]]{
                dp[j] = true
            }
        }
    }
    return dp[target]

}

 

posted @ 2025-04-07 20:48  我刀呢?  阅读(9)  评论(0)    收藏  举报