一道结合了数学和dp的题目,先用数学筛法筛出质数,在用dp[i]表示第i个质数有dp[i]种本质不同的形式
dp[j]+=dp[j-pr[i]],很简单的一个dp方程,初始化,dp[0]=1,或者所有质数为1,
//洛谷P2563
//#include<bits/stdc++.h>
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include<algorithm>
#include<cmath>
#include<stdlib.h>
using namespace std;
int dp[2000];//dp[i]表示第i个质数有dp[i]种本质不同的形式;
int n,pr[100];bool p[400],used[400];
int main()
{
for(int i=1;i<=200;i++)
p[i]=true;
for(int i=2;i<=200;i++)
{
if(p[i])
{
for(int j=i*i;j<=200;j+=i)
p[j]=false;
}
}
int x=0;
for(int i=2;i<=200;i++){
if(p[i])
{
pr[++x]=i;
}
}
while(scanf("%d",&n)&& n)
{
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=x;i++)
{
for(int j=pr[i];j<=200;j++)
dp[j]+=dp[j-pr[i]];
}
cout<<dp[n]<< endl;
}
return 0;
}