https://www.luogu.org/problem/show?pid=2563
比较裸的动态规划
完全背包嘛
我们可以把质数先给筛出来(不要看我用了欧拉筛,其实在这道题等于大材小用)然后直接DP
状态转移:f[j]+=f[j-pri[i]](pri是质数)
设个边界条件f[0]=1就好啦
#include<bits/stdc++.h>
using namespace std;
int pri[1001],f[1001],sum=0;
bool b[1001]={0};
inline void get(){
for(int i=2;i<=1000;i++){
if(!b[i])pri[++sum]=i;
for(int j=1;j<=sum;j++){
if(i*pri[j]>1000)break;
b[i*pri[j]]=1;
if(i%pri[j]==0)break;
}
}
}
int main()
{
int n;get();
f[0]=1;
for(int i=1;i<=50;i++)
for(int j=pri[i];j<=200;j++)f[j]+=f[j-pri[i]];
while(scanf("%d",&n)!=EOF)printf("%d\n",f[n]);
return 0;
}