13 部分和問題

 部分和問題
個の正整数 がある。この中からいくつかを選び、その和をちょうど にする
ことが出来るかどうかを判定する問題を部分和問題と言う。
:; を次のように定義する
この問題を解くために、
:; このとき
。
の中からいくつかを選び
その和をちょうど にすることができる時
それ以外の時
:; の値は、次の漸化式を用いて計算できる。
:; :; ある時点で
:; を選ばない または
を選ぶ の場合
それ以外の場合
:; を選ばない または
かつ : ; を選ぶ の場合
それ以外の場合
となれば、部分和問題の答えは「L
」であり、
分和問題の答えは「」である。
:; は、 :; であれば、部
の部分集合でその和が となるような部分集合全体を表す状態である
と考えることが出来る。この問題の場合、そのような部分集合が存在するかどうかだけを知れば良
いので、 : ; の値として または を用いれば良い。このように、多くの部分集合を
:; という
データに集約することで、列挙の数を減らし、計算効率を高めている。このような考え方を動的計
% )$$ と言う。
画法
すなおに実装すると、 : ; の値を格納するのに、2次元配列を用いることになるが、 : ; の値
:# ;
# の値から計算できるので、一次元配列を使いまわして、配列の後ろの要
素から前の要素へと計算を進めていくことができる。
は、
アルゴリズムの概略
を整数型の変数 "# 整数型の配列 ?@ . +5 + "/# 整数型の変数
に読み込む。
$ 整数型の配列 に対して、?@ 5 # ?@ 5 . +5 +5 / と初期化する。(空集合
で部分和 を実現できる。)
% +5 + " なる各 に対して順に を一つずつ増やしながら
./
,5 ,5 ?@ なる各 に対して順に を一つずつ減らしながら
? ?@@ が なら ?@ 5 とする( を選ぶ場合に相当する)
? @ が になれば「L
」と出力して終了
& ここが実行されるということは :; であることを意味するので、「」と出力して
終了
演習 %& 部分和問題を解くプログラムを作成して、データファイル 4∼4 に記載さ
れている部分和問題の解を求めよ。なお、データファイルの1行目には
行目には
個の整数 の値が書かれており、2
が間に空白を含む形で書かれており3行目には の値が書か
れている。