【AtCoder】Beginner Contest 167 C - Skill Up 【python】

アルゴリズム実技検定 公式テキスト (エントリー~中級編)の6.5.2で
第一回 アルゴリズム実技検定 過去問 G - 組分け
の類題として挙げられている問題を解いてみました。
AtCoder Beginner Contest 167 C - Skill Up
参考:アルゴリズム実技検定 公式テキスト (エントリー~中級編)の6.5.1のコード

N, M, X = map(int, input().split())
cost = []
understanding = []

for i in range(N):
    lst = list(map(int, input().split()))
    cost.append(lst[0])
    understanding.append(lst[1:])

ALL = 1<<N

def has_bit(n, i):
    return (n & (1<<i) > 0)

#集合ごとの理解度
result_u = []
for i in range(ALL):
    result_u.append([0]*M)

#集合ごとの金額
result_c = [0]*ALL

for n in range(ALL):
    for i in range(N):
        if has_bit(n, i):
            result_u[n] = ([x + y for (x, y) in zip(result_u[n], understanding[i])])
            result_c[n] += cost[i]

ans = float('inf')

#集合ごとに理解度がX以上か判定し金額の最小値を更新
for n in range(ALL):
    if min(result_u[n]) >= X:
        ans = min(ans, result_c[n])

if ans == float('inf'):
    print(-1)
else:
    print(ans)

少しbit全探索のイメージがつかめた気がします。