diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index 4d2e6bf6..5bd7ff6c 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -453,6 +453,7 @@ class Solution: ``` ### Go: +一维dp ```go // 分割等和子集 动态规划 // 时间复杂度O(n^2) 空间复杂度O(n) @@ -480,6 +481,44 @@ func canPartition(nums []int) bool { } ``` +二维dp +```go +func canPartition(nums []int) bool { + sum := 0 + for _, val := range nums { + sum += val + } + if sum % 2 == 1 { + return false + } + target := sum / 2 + dp := make([][]int, len(nums)) + for i := range dp { + dp[i] = make([]int, target + 1) + } + for j := nums[0]; j <= target; j++ { + dp[0][j] = nums[0] + } + for i := 1; i < len(nums); i++ { + for j := 0; j <= target; j++ { + if j < nums[i] { + dp[i][j] = dp[i-1][j] + } else { + dp[i][j] = max(dp[i-1][j], dp[i-1][j-nums[i]] + nums[i]) + } + } + } + return dp[len(nums)-1][target] == target +} + +func max(x, y int) int { + if x > y { + return x + } + return y +} +``` + ### JavaScript: ```js