先打表,再回溯+剪枝
AC代码:
#include<cstdio>
#include<cstring>
#include<cmath>
const int maxn=10000+5;
int cnt,vis[maxn],sum;
void dfs(int n,int index,int sum,int flag)
{
if(sum==n){
cnt++;
return;
}
for(int i=index;i<=n;++i)
{
if(sum+i>n) return;
if(!vis[i]) {
dfs(n,i+1,sum+i,flag+1);
if(flag>1) break;
}
}
}
int main()
{
//打表
int m=sqrt(maxn+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;++i) if(!vis[i])
for(int j=i*i;j<=maxn;j+=i) vis[j]=1;
int n;
while(scanf("%d",&n)==1&&n)
{
cnt=0;
dfs(n,2,0,1);
printf("%d\n",cnt);
}
}
如有不当之处欢迎指出!!