1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| func canPartition(nums []int) bool { if len(nums) < 2 { return false } sum := 0 for _, v := range nums { sum += v } if sum%2 != 0 { return false }
dp := make([]set, len(nums)) for i := 0; i < len(nums); i++ { dp[i] = make(map[int]bool) } dp[0].add(nums[0]) for i := 1; i < len(nums); i++ { for _, v := range dp[i-1].elements() { dp[i].add(v + nums[i]) dp[i].add(abs(v - nums[i])) } } for _, v := range dp[len(dp)-1].elements() { if v == 0 { return true } } return false }
func abs(x int) int { if x > 0 { return x } return -x }
type set map[int]bool
func (s set) add(num int) { if _, ok := s[num]; !ok { s[num] = true } }
func (s set) elements() (ans []int) { for i := range s { ans = append(ans, i) } return }
|