#include<bits/stdc++.h>
using namespace std;
bool isprime[1010];
long long prime[1010],ans[1010];
int cnt=1,answer=0;
void p(int n)
{
isprime[1]=0;
for(int i=2;i<=n;i++)
{
if(isprime[i])
{
int tem=i;
prime[cnt++]=tem;
for(int i1=2;i1*tem<=n;i1++) isprime[i1*tem]=0;
}
}
}//筛子
long long dfs(int n,int start)
{
if(n==1) return 0;
else if(ans[n]) return ans[n];
else
{
for(int i=start;i>=1;i--)
{
if(prime[i]<=n)
{
ans[n]+=dfs(n-prime[i],i);
}
}
}
return ans[n];
}//记忆化搜索,问题出在这,似乎无法搜索到所有的状态
int main()
{
memset(isprime,1,sizeof(isprime));
int n;cin>>n;
p(n);cnt--;
ans[0]=ans[2]=1;
ans[1]=0;
dfs(n,cnt);
for(int i=1;i<=n;i++) cout<<ans[i]<<' ';//调试代码
//cout<<ans[n];
return 0;
}
如题,本人的记忆化搜索似乎是无法考察到所有的状态。请求大佬修正