第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)!

京公网安备 11010502036488号