ホモサブセット


作成日:2022年2月1日午後7:36

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

# 합이 같은 부분 집합 (DFS)
import sys
sys.stdin = open("input.txt" ,"rt")

def DFS(index, l):
    if index == len(l):
        s = set()
        for i in range(len(l)):
            if ch[i] == 1:
                s.add(l[i])
        differenceSet = set(l) - s
        if sum(differenceSet) == sum(s):
            return True
        return False
    else:
        ch[index] = 1
        isSame = DFS(index+1, l)
        if isSame:
            return isSame
        ch[index] = 0
        isSame = DFS(index+1, l)
        return isSame
  
    
if __name__ == "__main__":
    n = int(input())
    ch = [0]*n
    l = list(map(int, input().split()))

    res = DFS(0, l)
    if res:
        print("YES")
    else:
        print("NO")

模範解答

import sys
sys.stdin=open("input.txt", "r")
def DFS(L, sum):
    if sum>total//2:
        return
    if L==n:
        if sum==(total-sum):
            print("YES")
            sys.exit(0)
    else:
        DFS(L+1, sum+a[L])
        DFS(L+1, sum)

if __name__=="__main__":
    n=int(input())
    a=list(map(int, input().split()))
    total=sum(a)
    DFS(0, 0)
    print("NO")

差異

  • の基本論理は同じである.
  • 私が実現したコードは、部分集合と求めた部分集合の要素の和を求めるステップですが、模範解答では部分集合を求めるのではなく、直接要素の和を求めて比較します.
  • の2つの部分の集合の和が等しいことを確認した後、私が実現した方法はisSame変数を通じて、再帰数を最終的にTrueに戻すことです.
  • の最良の答えでは、この場合sysである.exit(0)によりマージは行われず,強制終了の手法が用いられた.