已使用了背包求解,但发生了 RE 错误。
#include <cstdio>
#include <cstring>
const int N=1005;
int n,pointer,prime[N];
long long f[N];
bool isPrime[N];
void buildPrime(){
for(int i=2;i<N;++i){
isPrime[i]=true;
for(int j=0;j<pointer;++j){
if(i%prime[j]==0){
isPrime[i]=false;
break;
}
}
if(isPrime[i]){
prime[pointer++]=i;
}
}
}
void dp(){
// for(int i=2;i<=n;++i){
// for(int j=0;prime[j]<=i;++j){
// f[i]+=f[i-prime[j]];
// }
// }
for(int i=0;prime[i]<=n;++i){
for(int j=0;prime[i]+j<=n;++j){
f[prime[i]+j]+=f[j];
}
}
}
void init(){
memset(f,0,sizeof(f));
memset(prime,0,sizeof(prime));
memset(isPrime,0,sizeof(isPrime));
}
int main(){
init();
f[0]=1;
buildPrime();
scanf("%d",&n);
dp();
printf("%lld",f[n]);
}