' P '

whatever I will forget

全探索アルゴリズム ターゲット値に当てはまる積のパターン数の求め方

まったく解決法が見つからずにモヤモヤしたのでメモ

コンピューターが得意なのは計算とよく聞くけども、その考えをちゃんと活かさないといけない。

割り算(除算)は使うな

また、積の組み合わせを見つけ出すような課題の場合、割り算は使ってはいけない
割り算を使うと0が含まれる場合にエラーになってしまうので例外処理を考えるのが面倒かつロジックが複雑になる
ターゲット値 / (x * y * z) == 0 みたいなことをしてしまうと1つでも0があるとエラーになる。
数が少なければひとつずつ0じゃない場合なら、ほげほげする、とできるがそれだけでも面倒。

掛け算(乗算)を使え

積の組み合わせを求める場合は、掛け算を使おう
ターゲット値 == x * y * z というようにしておけばもし1つでも0があってもエラーにはならない

アルゴリズム

積のパターン数を見つける場合は、大層な感じですが、数学的に効率の良い解が無い限りは全探索(brute force search)を行えばいいです。 簡単な例を挙げると、1セント、5セント、25セントをもっていたとしてターゲットのXセントの払い方は何通りありますか?みたいな問題

100セント (ターゲット値)  
1セント (50枚持っている)
5セント(10枚持っている)
25セント(4枚持っている)

このような場合、積を出す際の固定値*xが100セントに成りうる全ての掛け合わせをコンピューターにやらせばいい。

int pattern = 0;
for(int i=0; i<=50; i++) {
  for(int j=0; j<=10; j++) {
    for(int k=0; k<=4; K++) }
      if(100 == 1*i + 5*j + 25*k) {
        pattern += 1;
      }
    }
  }
}

100にマッチする積をカウントしていけばいい。
いやー、これこそコンピューターにやらせる面倒なタスクの醍醐味だなあと今更しみじみ感じました。