1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 巡回セールスマン問題メニュー(言語選択)
  4. 問題一覧 Haskell(Beta)編
  5. ビットによる集合の表現 Haskell(Beta)編

巡回セールスマン問題メニューのサムネイル
ビットによる集合の表現 Haskell(Beta)編(paizaランク C 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

巡回セールスマン問題とは、都市の集合と各都市間の距離が与えられ、全都市をちょうど1回ずつ訪れたのち出発した都市に戻ってくるような経路 (巡回路) のうち最も短いものを求める問題です。

ここでは、巡回セールスマン問題を動的計画法で解くことを考えます。この解法では、都市の集合をビット列で表します。まずは、この表現をマスターしましょう。

都市の個数を n とし、各都市を 0, 1, ..., n-1 で表すことにします。また、都市の集合を S とします。このとき、都市 s_i が S に含まれているなら右から i 桁目は 1, 含まれていないなら 0とすると、都市の集合としてありうるもの全てを、長さ n のビット列 (0 以上 2^n-1 以下の整数) で表すことができます。


例えば、n = 4 のとき, 集合 S = {0, 3} のビット列による表現は1001で、整数値としては9となります。n = 6 のとき, 集合 S = {0, 1, 2, 3, 5} のビット列による表現は101111で、整数値としては47となります。

都市の個数 n と都市の集合 S が与えられるので、集合 S のビット列による表現を求め、その整数値を出力してください。

入力される値

n k
s_1 ... s_k


・ 1 行目に都市の個数 n と都市の集合 S に含まれる都市の個数 k が与えられます。
・ 2 行目には、都市の集合 S に含まれる都市が半角スペース区切りで与えられます。ただし、k = 0 のときは空行となります。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

都市の集合 S = {s_1, ... , s_k} のビット列による表現を求め、その整数値を出力してください。

条件

すべてのテストケースにおいて、以下の条件をみたします。
・ 入力はすべて整数
・ 1 ≦ n ≦ 16
・ 0 ≦ k ≦ n
・ 0 ≦ s_i ≦ n-1 (1 ≦ i ≦ k)
・ i ≠ j ならば s_i ≠ s_j

入力例1

6 5
3 5 0 2 1

出力例1

47

問題一覧へ戻る

ページの先頭へ戻る