完全背包问题,对物品和背包都有限制,所以要开二维数组
#include<stdio.h>
#include<string.h>
int dp[1125][15];//i表示当前到达的数字,j表示数字的个数
int prime[200];
int vis[1125];
int n,k;
void prim()
{
memset(vis,0,sizeof(vis));
int num=0;
for(int i=2;i<=1125;i++)
{
if(vis[i]==0)
{
num++;
prime[num]=i;
}
for(int j=1;((j<=num)&&(i*prime[j]<=1125));j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
{
break;
}
}
}
}
int main()
{
prim();
while(scanf("%d%d",&n,&k)!=EOF)
{
if(n==0&&k==0)
{
break;
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
int i,j,p;
for(i=1;i<=187&&prime[i]<=n;i++)
{
for(j=n;j>=prime[i];j--)
{
for(p=1;p<=k;p++)
{
dp[j][p]+=dp[j-prime[i]][p-1];
}
}
}
printf("%d\n",dp[n][k]);
}
}