代码拉取完成,页面将自动刷新
package main
import (
"fmt"
"sort"
)
// 回溯递归+ 剪枝,依然超时,看来动态规划不只是回溯解空间的单纯剪枝,就背包问题来说还可以达到更好的优化程度
// 因为
func canPartition(nums []int) bool {
n := len(nums)
target := 0
for _, v := range nums {
target += v
}
if target%2 != 0 {
return false
}
sort.Ints(nums)
sum := 0
flag := false
visted := make(map[int]bool)
var backtrace func(idx int)
backtrace = func(idx int) {
if idx > n {
return
}
if visted[sum] {
return
}
visted[sum] = true
if sum == target/2 || flag {
flag = true
return
}
for i := idx; i < n; i++ {
sum += nums[i]
if visted[sum] || sum > target/2 {
sum -= nums[i]
continue
}
backtrace(i + 1)
sum -= nums[i]
}
}
backtrace(0)
return flag
}
func main() {
fmt.Println((canPartition([]int{1, 5, 11, 5})))
fmt.Println(canPartition([]int{1, 2, 3, 5}))
fmt.Println(canPartition([]int{100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 99, 97}))
fmt.Println(canPartition([]int{14, 9, 8, 4, 3, 2}))
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。