package main import ( "fmt" "strconv" ) /** 本质上就是0-1背包问题,只不过需要传入一半的sum值,即可解决问题。 */ func solution(arr []int) string { sum := 0 for _, val := range arr { sum += val } if sum%2 != 0 { return "No" } half := sum / 2 dp := make([][]int, len(arr)+1) for i := range dp { dp[i] = make([]int, half+1) } //dp for r := 1; r < len(dp); r++ { for c := 1; c < len(dp[0]); c++ { if arr[r-1] > c { dp[r][c] = dp[r-1][c] } else { dp[r][c] = max(dp[r-1][c], dp[r-1][c-arr[r-1]]+arr[r-1]) } } } if dp[len(dp)-1][len(dp[0])-1] == half { return "Yes" } return "No" } func max(a, b int) int { if a > b { return a } return b } /* * 输入: 1234567 输出: Yes 说明: 将3、4、7染成红色即可,这样3+4+7=1+2+5+6 */ func main() { var str string fmt.Scanln(&str) arr := make([]int, len(str)) for i, _ := range str { ele, _ := strconv.Atoi(string(str[i])) arr[i] = ele } fmt.Println(solution(arr)) }