【AtCoder】Beginner Contest 142 E - Get Everything【python】

アルゴリズム実技検定 公式テキスト (エントリー~中級編)の6.5.3で
第一回 アルゴリズム実技検定 過去問 I - 部品調達
の類題として挙げられている問題を解いてみました。
AtCoder Beginner Contest 142 E - Get Everything
参考:アルゴリズム実技検定 公式テキスト (エントリー~中級編)の6.5.3のコード

N, M = map(int, input().split())

A = [0]
C = [0]

for i in range(M):
    a, b = map(int, input().split())
    c = list(map(int, (input().split())))
    c = [v-1 for v in c]
    A.append(a)
    c_val = 0
    for j in c:
        c_val |= 1<<j
    C.append(c_val)

ALL = 1<<N

# cost[i][n]: 鍵iまで見て開けられる宝箱の集合が n であるときのコスト最小値
cost = []
for n in range(M+1):
    cost.append([float('inf')]*ALL)

cost[0][0] = 0

for i in range(1, M+1):
    for n in range(ALL):
        cost[i][n] = min(cost[i][n], cost[i-1][n])
        cost[i][n|C[i]] = min(cost[i][n|C[i]], cost[i-1][n] + A[i])

ans = cost[M][ALL-1]
if ans == float('inf'):
    ans = -1
print(ans)
c_val |= 1<<j

cost[i][n|C[i]]

この部分がパッと出てくるようになりたいですね。