问题
分析
类似0-1背包 ,dp问题,打表,然后查询
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=1121,maxk=15;
int n,k,vis[maxn+10],dp[maxk][maxn]; //
vector<int> prime;
void get_prime(){
int m=sqrt(maxn+10);
for(int i=2;i<=m;++i){
if(vis[i]==0){
for(int j=i*i;j<maxn;j+=i){
vis[j]=1;
}
}
}
for(int i=2;i<maxn;++i){
if(vis[i]==0){
prime.push_back(i);
}
}
}
void get_table(){
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(int i=0;i<prime.size();++i){
for(int k=14;k>0;--k){ //必须逆序,避免重复增加一个数
for(int v=prime[i];v<maxn;++v){
// if(dp[k-1][v-prime[i]]>0) continue;
dp[k][v]+=dp[k-1][v-prime[i]];
}
}
}
}
int main(void){
get_prime();
get_table();
while(scanf("%d%d",&n,&k)==2 && (n||k)){
if(k==1 && n==1) printf("0\n");
else printf("%d\n",dp[k][n]);
}
return 0;
}