一道结合了数学和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;
}