package main import "fmt" // メモ化用のキャッシュ var memo map[[3]int]bool // 天秤が水平になるおもりの組み合わせが存在するかどうかを判定する関数 func findBalance(weights []int, leftSum, rightSum, index int) bool { // メモがあれば結果を返す if result, found := memo[[3]int{leftSum, rightSum, index}]; found { return result } // 全てのおもりを使用した場合、左右の合計が等しいかどうかを確認 if index == len(weights) { result := leftSum == rightSum // メモに保存 memo[[3]int{leftSum, rightSum, index}] = result return result } // 現在のおもりを左に置いた場合 if findBalance(weights, leftSum+weights[index], rightSum, index+1) { // メモに保存 memo[[3]int{leftSum, rightSum, index}] = true return true } // 現在のおもりを右に置いた場合 if findBalance(weights, leftSum, rightSum+weights[index], index+1) { // メモに保存 memo[[3]int{leftSum, rightSum, index}] = true return true } // どちらにも置かない場合 // メモに保存 memo[[3]int{leftSum, rightSum, index}] = false return false } func main() { // おもりの重さのリスト weights := []int{1, 2, 3, 4, 5} // メモを初期化 memo = make(map[[3]int]bool) // すべてのおもりを使用して天秤が水平になる組み合わせがあるかどうかを判定 if findBalance(weights, 0, 0, 0) { fmt.Println("possible") } else { fmt.Println("impossible") } }