BNU Graceful Prime Decomposition 记忆化搜索

来源:互联网 发布:知悉与悉知的区别 编辑:程序博客网 时间:2024/06/05 18:33

将n分成素数相加的形式,相加的素数必须小于k并且相加的素数不能连续出现。素数的顺序不同算是不同的相加方式。

给定n,k,问素数相加的方式有几种?题目&&样例

   打巨表过的,原来我对打表还不熟悉。看看下面写的,真是神奇!!!记忆化搜索,dp思想。。。

#include <iostream>#include <cstdio>#include <cmath>#include <string>#include <cstring>#include <cstdlib>#include <algorithm>using namespace std;#define M 1004int num[M];int p[M];int n,k;void pri(){    memset(num,0,sizeof(num));    int cnt=1;    num[1]=1;    for(int i=2; i<=36; i++)    {        if(num[i]==0)        {            p[cnt++]=i;            for(int j=i*2; j<60; j+=i)                num[j]=1;        }    }}void solve(){    cin>>n>>k;    int dp[55][55];    int ans[55];    ans[1]=0;    memset(dp,0,sizeof(dp));    for(int tmp = 2; tmp <= n; tmp ++)    {        ans[tmp] = 0;        if(!num[tmp] && tmp <= k)        {            dp[tmp][tmp] = 1;            ans[tmp] ++;        }        for(int i = 2; i < tmp; i ++)        {            if(i > k) break;            if(num[i]) continue;            dp[tmp][i] += ( ans[tmp - i] - dp[tmp - i][i] );            ans[tmp] += dp[tmp][i];        }    }    cout<<ans[n]<<endl;}int main(){    int t;    scanf("%d",&t);    pri();    for(int cas=1; cas<=t; cas++)    {        solve();    }    return 0;}


原创粉丝点击