ここでは、部分和問題について、 「プログラミングコンテストチャレンジブック(第2版)」の p34 を例に、深さ優先探索(DFS) を使って python3 で実装する方法を紹介します。
計算量は、O(2^n) です。
# 入力
a = [1, 2, 4, 7]
n = 4
k = 13
# i まででsum(mysum)を作って、残り i 以降を調べる
def dfs(i, mysum):
# n個決め終わったら、今までの和 mysumが k と等しいかを返す
if i == n:
return mysum == k
# a[i] を使わない場合
if dfs(i + 1, mysum):
return True
# a[i] を使う場合
if dfs(i + 1, mysum + a[i]):
return True
# a[i]を使う使わないに拘わらず k が作れないので false を返す
return False
if __name__ == '__main__':
if dfs(0,0):
print('Yes')
else:
print('No')