ネタバレになるので。。。
回答
まず素数を求める(が、私は素数を求めるのが苦手なので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