メモ帳

楽しいアウトプットの場所

蟻本p34 部分和問題 深さ優先探索をNimで解く

問題

整数a_1, a_2, ..., a_nが与えられます。その中からいくつか選び、その和をちょうどkにすることができるか判定しなさい。

入出力

n = 4\\
a = {1, 2, 4, 7}\\
k = 13\\
\rightarrow Yes(13 = 2+4+7)\\
n = 4\\
a = {1, 2, 4, 7}\\
k = 15\\
\rightarrow No

コード

import sequtils, strutils, strformat, algorithm, math, sugar, complex
{.warning[UnusedImport]: off.}

var n, k: int
var a = newseq[int]()

proc dfs(i:int, sum:int): bool = 
    if i == n: return sum == k

    if dfs(i+1, sum): return true 
    if dfs(i+1, sum+a[i]): return true
    return false

n = stdin.readLine.parseInt()
a = stdin.readLine.split.map(parseInt)
k = stdin.readLine.parseInt()

if dfs(0, 0): echo "Yes"
else: echo "No"