名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

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