[Programación problema] impacto de piedras
podemos considerar el siguiente procedimiento:
la piedra divididos en dos grupos, uno de piedra tomada de la pila m A, B pila tomada n, puede suponer que m> = n.
Después de los escombros colisión es mn, Un montón debe ser colocado.
Antes y después de la colisión, se encuentran dos pilas de baja calidad no ha cambiado. Repita la operación hasta el momento de la colisión y vaya a la izquierda una pila, se encuentra el resto de la diferencia es la calidad de las pilas. Realmente muy inteligente, por lo que a fin de que la calidad final del mínimo restante, debemos dejar que la calidad de los montones de piedras tan cerca como sea posible, es decir, lo más lejos posible de la media.
Además, cuando la capa interior para muy inteligente. Empecé a escribir que i ++, esto dará lugar a la reutilización v. Por ejemplo, v es una piedra de 20, 40, 60 ... que será marcado como verdadera. Deslizando la circulación escala puede evitar este problema.
package main
import (
"fmt"
)
func main() {
var n, tmp, sum, max int
var w []int
fmt.Scan(&n)
for i := 0; i < n; i++ {
fmt.Scan(&tmp)
sum += tmp
w = append(w, tmp)
}
flag := make([]bool, sum/2+1)
flag[0] = true
for _, v := range w {
for i := sum / 2; i >= v; i-- {
flag[i] = flag[i] || flag[i-v]
}
}
for i := sum / 2; i >= 0; i-- {
if flag[i] {
fmt.Print(sum - 2*i)
break
}
}
}