ビット全探索 入門 1 Erlang(Beta)編(paizaランク C 相当)
問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
問題
下記の問題をプログラミングしてみよう!
説明 この章では、ビット全探索について学んでいきます。
ビット全探索とは、ビット列を用いて集合の部分集合をすべて列挙するアルゴリズムです。
ある集合の部分集合をビット列で表現する方法を考えます。
集合の各要素に対応するビットが 1 か 0 かでその要素を含むかどうかを表現することにします。
要素数 N の集合の部分集合は N 桁のビット列によって表されます。
例えば、集合 {1, 2, 4, 7} の部分集合をビット列で表現することを考えます。
ここでは、集合の各要素を値の小さい順にビット列の下位から順に対応させることにします。
すると、ビット列 0101 は部分集合 {1, 4} を、ビット列 1001 は部分集合 {1, 7} を表します。
このように、各要素が含まれるか否かを表すビット列を使って表現することで、部分集合を列挙することができます。
ここで、整数を 2 進数表記したものをビット列として考えると、N 桁のビット列は整数 0 ~ 2^N - 1 を用いて表現できます。
例えば、整数 9 に対応する 4 桁のビット列は 1010 であり、このビット列が表す部分集合は {2, 7} です。
問題 要素数 N の整数の集合 S があたえられます。
集合 S の部分集合を表すビット列とそのビット列に対応する部分集合の要素をすべて出力してください。
出力は、以下の出力形式に従ってください。
出力するビット列を B、そのビット列に対応する部分集合の要素を t_1, t_2, t_3 ... としたとき、以下の形式で出力してください。
B {t_1 t_2 t_3 ...}
ただし、集合 S の各要素を値の小さい順にビット列の下位から順に対応させることとします。
出力例も参照してください。
入力される値
N S_1 S_2 ... S_N ・ 1 行目には整数 N が与えられます。 ・ 2 行目には、集合の要素 S_i が空白区切りで与えられます。 ・ 入力は合計で 2 行からなり、入力値最終行の末尾に改行が 1 つ入ります。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
標準入力からの値取得方法はこちらをご確認ください
期待する出力
要素数 N の集合の部分集合の個数を X としたとき、期待する出力は X 行からなります。 X 行にわたって、集合 S の部分集合を重複なくすべて出力してください。 出力するビット列を B、そのビット列に対応する部分集合の要素を t_1, t_2, t_3 ... としたとき、以下の形式で出力してください。 B {t_1 t_2 t_3 ...}
条件
すべてのテストケースにおいて、以下の条件をみたします。 ・ 1 ≦ N ≦ 8 ・ 0 ≦ S_1 < S_2 < ... < S_N ≦ 10^5
出力例1
000 {} 001 {0} 010 {1} 011 {0 1} 100 {3} 101 {0 3} 110 {1 3} 111 {0 1 3}
出力例2
1011 {105 143 755} 1001 {105 755} 0100 {229} 1010 {143 755} 1100 {229 755} 0001 {105} 0111 {105 143 229} 1111 {105 143 229 755} 0110 {143 229} 0010 {143} 0101 {105 229} 1101 {105 229 755} 1110 {143 229 755} 0011 {105 143} 0000 {} 1000 {755}
問題一覧へ戻る