問題
都道府県からいくつかを選んで、その人口の合計が1千万人にもっと近い組み合わせとその人口を求めてください。
各都道府県の人口は、2015年(平成27年)の国勢調査に基づきます。
2015年(平成27年)国勢調査 各都道府県人口 - https://www.stat.go.jp/data/kokusei/2015/kekka.html
解き方・ソースコード
単純に全ての組み合わせを調べると、各都道府県を「選ぶ」「選ばない」の2通りがあり、47都道府県で $ 2^{47} $ 通りを調べなければなりません。
これは現実的ではありません。
そこで枝狩りという手法を使います。
枝刈りとは、探索の途中において必要な条件を満たしているかどうかをチェックすることです。
必要な条件を満たしていなければ、そこで処理を中断します。
目的の1000万人を超えた場合、それ以上追加しても近づくことはありません。
また、それまでに調べた値より1000万人とのズレが大きいときも調べる必要はありません。
そこでこれらの条件を踏まえた上で、北海道から順に「選ぶ」「選ばない」のパターンを枝狩りしながら再帰的に探索します。
ズレを求めるには、1000万人との差の絶対値(abs関数)を使います。
[Google Colaboratory]
1 | # 近づける値 |
[実行結果]
解: 10000000
青森県、宮城県、福井県、岐阜県、鳥取県、徳島県、佐賀県、長崎県の人口を合計するとちょうど10000000人になります。