#include #include using namespace std; struct SieveEratos{ vector t; SieveEratos(int n):t(n+1,true){ t[0] = t[1] = 1; for(int i = 2; n >= i; i++){ if(t[i]){ for(int j = i+i; n >= j; j+=i){ t[j] = 0; } } } } bool operator[](int x){return t[x];} }; vector> dp(3000,vector(20000,-1)); int main(){ int n;cin>>n; SieveEratos A(n+1); vector B; for(int i = 2; n >= i; i++){ if(A[i])B.push_back(i); } dp[0][0] = 0; for(int i = 0; B.size() > i; i++){ for(int j = 0; n >= j; j++){ if(dp[i][j] == -1)continue; if(j+B[i] <= n)dp[i+1][j+B[i]] = max(dp[i+1][j+B[i]],dp[i][j]+1); dp[i+1][j] = max(dp[i+1][j],dp[i][j]); } } cout << dp[B.size()][n] << endl; }