poj 3132简单dp

来源:互联网 发布:python 保存日志文件 编辑:程序博客网 时间:2024/05/18 15:07

只要把每个素数筛出来,并用三维dp一下,dp[n][t][k],表示前k个素数表示出的n、t元素,转移方程为:dp[n][t][k]=dp[n][t][k-1]+dp[n-prim[k]][t-1][k-1].无坑点。

#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using  namespace std;int dp[1125][15][188];int prim[188];int vis[1125];int main(){    int i,j,n,m,k,p,t;    int tot=0;    for(i=2;i<=1120;i++)    {        if(!vis[i])        {            prim[tot++]=i;            for(j=2*i;j<=1120;j+=i)                vis[j]=1;        }    }    for(i=0;i<tot;i++)        dp[0][0][i]=1;    dp[2][1][0]=1;    for(i=2;i<=1120;i++)    {        for(j=1;j<=14;j++)        {            for(k=0;k<tot;k++)            {                if(k>0&&prim[k]<=i)                dp[i][j][k]=dp[i][j][k-1]+dp[i-prim[k]][j-1][k-1];                if(k>0&&prim[k]>i)                    dp[i][j][k]=dp[i][j][k-1];            }        }    }    while(1)    {        cin>>k>>p;        if(!k&&!p)            break;        printf("%d\n",dp[k][p][tot-1]);    }    return 0;}


0 0
原创粉丝点击