dp[j][k]表示用j个质数表示k这个值得方法数。
一个质数只能用一次,类似01背包。
#include<cstdio>
#include<cstring>
const int maxn=1130;
int pri[maxn+10],dp[20][maxn+10];
void init()
{
int i,j;
for(i=0;i<=maxn;i++) pri[i]=1;
pri[0]=pri[1]=0;
for(i=2;i<=maxn;i++)
{
if(!pri[i]) continue;
for(j=i+i;j<=maxn;j+=i)
pri[j]=0;
}
}
int main()
{
init();
int i,j,k,m,n;
while(scanf("%d%d",&n,&m)&&(n||m))
{
memset(dp,0,sizeof dp);
dp[0][0]=1;
for(i=2;i<=n;i++)
{
if(!pri[i]) continue;
for(k=n;k>=i;k--)
for(j=m;j>0;j--)
dp[j][k]+=dp[j-1][k-i];
}
printf("%d\n",dp[m][n]);
}
return 0;
}