【競プロ】過去問精選100問「ALDS_5_A - 総当たり」解法
Free-PhotosによるPixabayからの画像

はじめに

このシリーズではレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】でまとめられている100問をPythonで解いています。

問題

ALDS_5_A - 総当たり

ポイント

ビット全探索で全ての組み合わせパターンを確認し、与えられたmが作れるかを検証します。

コード

def main():
    N = int(input())
    A = [i for i in map(int, input().split(" "))]
    Q = input()
    M = [i for i in map(int, input().split(" "))]

    sums = set()
    
    # ビット全探索で全ての組み合わせパターンを確認する
    for i in range(2**N):
        tmp = 0
        for j in range(N):
            if (i >> j) & 1:
                tmp += A[j]
        sums.add(tmp)
  
  # 与えられたmが作れるかを確認する
    for i in M:
        if i in sums:
            print('yes')
        else:
            print('no')

if __name__ == '__main__':
    main()
おすすめの記事