読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

No.458 異なる素数の和

ネタバレになるので。。。



回答

まず素数を求める(が、私は素数を求めるのが苦手なのでRubyのライブラリでボコる)。
その後は大きい素数から適応していき、範囲20000を埋めていきます。典型的なDPな気がします。

ちなみに私は最初小さい素数から適応していったのですが、どうしても5のときは3+2だから2、7のときは5+2だから3+2+2で3みたいな回答にハマってしまい、最終的に大きい素数から適応するという解放に落ち着いたのですが、コレは正しかったんでしょうかね。。。


それと素数求めるのがパットできないので、RubyのPrimeライブラリの挙動を参考に素数を求めるライブラリを自作したほうが良さそうだなあと思いました。年末年始の宿題にすることにします・・・。


#140903 No.458 異なる素数の和 - yukicoder

require 'prime'

MAX_NUMBER = 20001
dp = Array.new(MAX_NUMBER, 0)
primes_list = Prime.each(MAX_NUMBER).to_a.reverse
n = gets.chomp.to_i
for i in primes_list do
    dp[i] = 1
end

for i in primes_list do
    (MAX_NUMBER-i-1).downto(i+1) do |j|
        if dp[j] > 0
            if dp[j]+1 > dp[j+i]
                dp[j+i] = dp[j]+1
            end
        end
    end
end

puts dp[n] > 0 ? dp[n] : -1