【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]]
この部分がパッと出てくるようになりたいですね。