技巧
减枝DFS
思路
必须要三个减枝全都考虑到 .... 实现部分AC不掉的。卡了我一天。
降序从大到小尝试 达到调价J再变回0 这点值得思考和借鉴 一直没想到
实现
package main
import (
"bufio"
. "fmt"
"io"
"os"
"sort"
)
var vis []bool
func dfs(a []int, currLen, currLine, targetLen, targetLine, j int) bool {
if currLen > targetLen {
return false
} else if currLen == targetLen {
j, currLen, currLine = 0, 0, currLine+1
}
if currLine == targetLine {
return true
}
// 如果是尾部 则不用动这里的位置
for i := j; i < len(a); i++ {
if !vis[i] {
vis[i] = true
// 减枝3 i+1 由于是有序的所以往下看就好
if dfs(a, currLen+a[i], currLine, targetLen, targetLine, i+1) {
return true
}
vis[i] = false
// 减枝1 头尾不对
if currLen == 0 || currLen+a[i] == targetLen {
return false
}
// 减枝2 相同长度的就不用试了
for i < len(a)-1 && a[i] == a[i+1] {
i++
}
}
}
return false
}
func NC50243(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
var n int
Fscan(in, &n)
a := make([]int, n)
vis = make([]bool, n)
max := 0
total := 0
for i := 0; i < n; i++ {
Fscan(in, &a[i])
total += a[i]
if a[i] > max {
max = a[i]
}
}
sort.Slice(a, func(i, j int) bool { return a[i] > a[j] })
for i := max; i <= total; i++ {
if total%i == 0 {
if dfs(a, 0, 0, i, total/i, 0) {
Fprintln(out, i)
break
}
}
}
}
func main() {
NC50243(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号