思路:
dp[i]表示1到i有多少种方案;
从1到n遍历,选择当前遍历的数是否可选(是否为素数);
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int vis[1010];
int ans[1010];
int cnt = 1;
void prime(int n)
{
for(int i = 2; i <= n; i++)
{
if(!vis[i])
{
ans[cnt++] = i;
for(int j = i*2; j <= n; j += i)
{
vis[j] = 1;
}
}
}
}
ll dp[1010];
int main()
{
int n;
cin>>n;
dp[0] = 1;
prime(n);
for(int i=2;i<=n;i++)
if(!vis[i])
for(int j=i;j<=n;j++)
dp[j]+=dp[j-i];
cout<<dp[n];
}