关于枚举顺序
查看原帖
关于枚举顺序
1219953
Forose楼主2024/3/3 15:04

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;
}

仿佛只有枚举顺序不同

为什么要按照那个顺序枚举呢

2024/3/3 15:04
加载中...