問題
N 個の品物があります。 品物には 1,2,…,N と番号が振られています。 各 i (1≦i≦N) について、品物 i の重さは w_i で、価値は v_iです。 N 個の品物のうちいくつかを選び、ナップサックに入れて持ちかえります。 ナップサックの容量は W であり、持ち帰る品物の重さの総和は W 以下でなければなりません。 持ち帰る品物の価値の総和の最大値を求めてください。
解法・ソースコード
今回は、もっとも単純な ナップサック問題 のおさらいです。
品物ごと、許容範囲の重さごと にループを回して、品物を入れるか入れないかを選択し、価値の高くなる方の選択結果を メモ化テーブル に格納していきます。
[Google Colaboratory]
1 | #--------- 入力例1 ---------- |
[実行結果(入力例1)]
【メモ化テーブルの内容】 0 0 30 30 30 30 30 30 0 0 30 50 50 50 80 80 0 0 30 50 60 60 80 90 ----------------------- 解(価値の総和の最大値): 90
品物 1,3 を選ぶと、重さの総和は 3+5=8 となり、価値の総和は 30+60=90 となります。
[実行結果(入力例2)]
【メモ化テーブルの内容】 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 2000000000 2000000000 2000000000 2000000000 1000000000 2000000000 3000000000 3000000000 3000000000 1000000000 2000000000 3000000000 4000000000 4000000000 1000000000 2000000000 3000000000 4000000000 5000000000 ----------------------- 解(価値の総和の最大値): 5000000000
全部の品物 を持っていくことができるので、価値の総和は 5000000000 となります。
[実行結果(入力例3)]
【メモ化テーブルの内容】 0 0 0 0 0 5 5 5 5 5 5 5 5 5 5 0 0 0 0 6 6 6 6 6 6 11 11 11 11 11 0 0 0 0 6 6 6 6 6 6 11 11 11 11 11 0 0 0 0 6 6 6 6 6 6 12 12 12 12 12 0 0 5 5 6 6 6 11 11 11 12 12 12 17 17 0 0 5 5 6 6 6 11 11 11 12 12 12 17 17 ----------------------- 解(価値の総和の最大値): 17
品物 2,4,5 を選ぶと、重さの総和は 5+6+3=14 で価値の総和は 6+6+5=17 となります。