碁を打つ


作成日:2022年2月3日午後6:15

インプリメンテーションコード

# 바둑이 승차 (DFS)
import sys
sys.stdin = open("input.txt", "rt")

def DFS(index, sum):
    global res
    if index == n:
        if sum < c and sum > res:
            res = sum
        else:
            return
    else:
        DFS(index+1, sum+l[index])
        DFS(index+1, sum)

if __name__ == "__main__":
    c, n = map(int, input().split())
    l = []
    for _ in range(n):
        l.append(int(input()))
    res = 0
    DFS(0, 0)
    print(res)
  • 問題:nが高いほど実行時間が長くなり、エラー処理につながる.
  • 模範解答

    # 바둑이 승차 (DFS)
    import sys
    #sys.stdin = open("in5.txt", "rt")
    
    def DFS(index, sum, tsum):
        global res
        if sum + (total-tsum) < res:
            return
        if sum > c:
            return
        if index == n:
            if sum > res:
                res = sum
            else:
                return
        else:
            DFS(index+1, sum+l[index], tsum+l[index])
            DFS(index+1, sum, tsum+l[index])
    
    if __name__ == "__main__":
        c, n = map(int, input().split())
        l = []
        for _ in range(n):
            l.append(int(input()))
        res = 0
        total = sum(l)
        DFS(0, 0, 0)
        print(res)

    差異

  • Cut Edgeテクノロジー(枝切り)

  • 私が実装したコードの問題-実行時間を大幅に減らすために、条件文を正しい答えから逸脱した条件ですぐに関数を返すように構成します.
    if sum + (total-tsum) < res:
            return

  • 上記のコードに木構造が追加され、再帰的な検査を継続する過程で、リスト全体の和(total)から、これまでの検査の総数(tsum)の和(すなわち、将来木の残りの値をすべて加算すると仮定)を減算すると、最後に計算され、正解(res)が得られる更新できない場合はreturnで退出する仕組みです.