【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全探索のイメージがつかめた気がします。