题意:选择K个质数,使它们的和等于N。给出N和K(N<=1120,K<=14),问有多少种满足条件的方案,注意1不是素数,因此n = k = 1时答案为0
思路:1.素数筛法求出所有范围内的素数
2.0-1背包动态规划
有点不太明白三重循环的嵌套和顺序问题,还需要再看看
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
const int maxn = 1200 + 2;
int vis[maxn],prime[maxn];
int num = 0,dp[maxn][15];
void get_prime()
{
memset(vis,0,sizeof(vis));
for(int i = 2; i < maxn; i++)
{
if(!vis[i])
{
prime[num++] = i;
for(int j = i * 2; j < maxn; j += i) vis[j] = 1;
}
}
}
void init()
{
dp[0][0] = 1;
for(int k = 0; k < num; k++)
{
for(int i = maxn; i >= prime[k]; i--)
{
for(int j = 1; j < 15; j++)
{
dp[i][j] += dp[i - prime[k]][j - 1];
}
}
}
}
int main()
{
get_prime();
init();
int n,k;
while(scanf("%d%d",&n,&k) && n + k)
{
printf("%d\n",dp[n][k]);
}
return 0;
}