AC代码(枚举顺序与题解一样):
#include<cstdio>
#define int long long
int n,book[1005],p[1005],dp[1005];
signed main(){
scanf("%lld",&n);
for(int i=2;i<=n;i++){
int flag=1;
for(int j=2;j*j<=i;j++){
if(i%j==0){
flag=0;
break;
}
}
if(flag==1) book[i]=1;
}
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(book[i]==1) dp[j]+=dp[j-i];
}
}
printf("%lld",dp[n]);
return 0;
}
过不了样例代码
#include<cstdio>
#define int long long
int n,book[1005],p[1005],dp[1005];
signed main(){
scanf("%lld",&n);
for(int i=2;i<=n;i++){
int flag=1;
for(int j=2;j*j<=i;j++){
if(i%j==0){
flag=0;
break;
}
}
if(flag==1) book[i]=1;
}//筛质数
dp[1]=0,dp[2]=1;//初始化
for(int i=3;i<=n;i++){
for(int j=1;j<=i;j++){
if(book[i]==1) dp[i]+=dp[i-j];//一样的转移方程
}
if(book[i]==1) dp[i]++;//自身为质数的情况
}
printf("%lld",dp[n]);
return 0;
}
仿佛只有枚举顺序不同
为什么要按照那个顺序枚举呢