第i个数有多少种相加的方法:dp[ i ]=dp[ i ]+dp[ i -素数 ];
假设有500个素数,时间复杂度500*1000=5e5;
#include <iostream>

using namespace std;

const int N=1004;
long long  prime[N],dp[N];
bool st[N];
int n,cnt;

void chart(){
	for(int i=2;i<=n;i++){
		if(!st[i]) prime[cnt++]=i;
		for(int j=0;prime[j]<=n/i;j++){
			st[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
}

int main(int argc, char** argv) {
	cin>>n;
	chart();
	dp[0]=1;
	for(int i=0;i<cnt;i++){
		for(int j=prime[i];j<=n;j++){
			dp[j]=dp[j]+dp[j-prime[i]];
		}
	}
	cout<<dp[n]<<endl;
	return 0;
}

一开始是暴力
把1~n素数找到
然后递归遍历素数相加直到sum大于或等于n回溯
时间复杂度:(估计)(500/2)!