先日,Twitterを見てたら,
こんなのツイートが流れていた.
「1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0の10個と + - × ÷ ( )を使って大きい数を作れ」という問題。10万以上から「ちょっと賢い」ラインだそうだけど1万も厳しい s01 250favs
— ★1000ふぁぼツイート☆さん (@1000favs_) 6月 24, 2012
ちょっと面白そうだったので考えてみた.
まず初めに適当にMATLABスクリプトを書いて,
Macbookに解かせようと思ったけど,
実は全探索するにはちょっと厳しいことにすぐ気がついた.
とりあえず数字の順番を固定して,
しかも括弧も無視して,
数字の間に4種類の四則演算子をいれると問題を単純化させても,
4^(10-1)=262144個も場合の数が出るので,
ちょっとループを回すのは辛いなと....
しょうがないので,
人間的ひらめきで考えることにした.
まず大きな数を作るんだから,
+とxを使ってどれくらい大きくなるのかを考えてみた.
でも,色々やっても1000ぐらいが限界....
そもそも万単位はイケるとのことなので,
そもそも何か根本的に違うアプローチがあると思い考えなおしてみた.
すると,
数を大きくするから+とxだって思ってたけど,
実は別の方法があることに気がつく.
それは,小さい数で割るってこと.
例えば,0.001である数を割ると,
それはその数を1000倍しているのと同じ数になるというわけです.
この問題では大きい数を作って掛けるのは難しいけど,
小さい数を作って割るのはできそうな雰囲気ですね.
そこで一番使う数字を少ない状態で小さい数字を作ることを考えると,
やっぱりそれぞれの数字の差が0.1なので,
下記の数式を思いついた.
2.0×1.9÷(1.2-1.1)÷(1.4-1.3)÷(1.6-1.5)÷(1.8-1.7)=38000
ついに,万の桁に!
ただ,1.9と2.0の部分がまだ最適化できる気がする.
そこで10分ほど悩んだ結果,
2.0÷(1.2*1.1-1.3)÷(1.5-1.4)÷(1.7-1.6)÷(1.9-1.8)=100000
ついに100000!!
これ以上は無理でした(笑)
おそらく,
最近,勉強しているこの本に書いてある
動的計画法を使えば,全探索しなくても効率良く最適解が
計算できるんだろうなって思いました.
しかし,学生の時はこうゆう問題は全然興味が無かったけど,
大人になると楽しくなるって不思議ですね.