放题解
放代码
#include<bits/stdc++.h>
using namespace std;
int n,a[1005];//n为被分解数 a数组用于存储素数
long long dp[1005];//dp数组用于存储方案数(下标为n)
int prime(int x)//埃氏筛法计算素数个数
{
int flag[x+10];
memset(flag,1,sizeof(flag));
for(int i=2; i<=x; i++)
if(flag[i])
for(int j=i*2; j<=x; j+=i)
flag[j]=0;
int sum=0;
for(int i=2; i<=x; i++)
if(flag[i]) a[++sum]=i;
return sum;
}
int main()
{
dp[0]=1;//注意这里要填1不能填0,就像斐波那契数列第一个数也不能为0
cin>>n;
for(int i=1; i<=prime(n); i++)//推到n结束
for(int j=a[i]; j<=n; j++) //完全背包的正循环
{
dp[j]=dp[j]+dp[j-a[i]];//递推式
}
cout<<dp[n];
return 0;
}