[SWEA] 4839. [Python S/Wトラブルシューティング基本]2日目-サブセットの和[D 3]


📚 質問する
https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do
ローカルセットを求めるには、<<ビット演算子を使用します.(1<そして, i & (1 << j)バイナリの各ビット数に1があることを確認し,部分集合の値を入れる.
部分集合の出現をバイナリ符号化し,機械を理解しやすく計算すれば容易に変化する.
2 n 2^n 2 nは1つ1つ符号化され、i & (1 << j)は1つ1つそれを部分集合の因数と結びつけて抽象的に復号化する.
📒 コード#コード#
T = int(input())
A = list(range(1, 13))    # A: [1,2,...,12]
for tc in range(1, T+1):
    N, K = map(int, input().split())    # N:부분집합 원소의 수, K:부분 집합의 합
    result_sum = 0 # 만족시키는 부분집합 개수
    for i in range(1 << 12): # 모든 부분집합 탐색
        cnt = 0
        sum_num = 0
        for j in range(12):
            if i & (1 << j):
                sum_num += A[j]
                cnt += 1
        if cnt == N and sum_num == K:
            result_sum += 1 # 만족시키는 경우 + 1

    print(f'#{tc} {result_sum}')
🔍 結果:Pass
これは文で部分集合を表すよりもずっと速く、簡単なので、ビット演算子を使って問題を解決することを知っておく必要があります.