全探索: ビットで全パターンを試そう
ビット全探索は、選ぶ・選ばないを0と1で表し、すべての組み合わせを試す方法です。
3個の品物なら、各品物について「選ぶ」「選ばない」の2択があるので、全部で 2 × 2 × 2 = 8 通りです。
使いどころ
- 個数が少ないときの全パターン確認
- 部分集合を作る問題
- ナップサック問題の小さい版
手順
0から2^n - 1までの数を使う- 各ビットを見る
- ビットが1ならその要素を選ぶ
- 作った組み合わせを調べる
図で見る
コピペ用コード
items = [3, 5, 8]
for bit in range(1 << len(items)):
selected = []
for i in range(len(items)):
if bit & (1 << i):
selected.append(items[i])
print(selected)
コードの読み方
1 << len(items)は、2^nを表します。bit & (1 << i)で、i番目を選んでいるか判定します。selectedに、そのパターンで選んだ要素を入れています。
注意点
要素数が増えるとパターン数が一気に増えます。20個を超えるとかなり重くなることがあります。