分割等和子集
问题
给你一个 只包含正整数 的 非空 数组 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] }
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号