题意:
选择K个质数使它们的和为N,求总的方案数。
分析:
虽然知道推出来了转移方程, 但还是没把代码敲出来,可能基本功还是不够吧。
d(i, j)表示i个素数的和为j的方案数,则 d(i, j) = sigma d(i-1, j-p[k]) ,其中p[k]表示第k个素数
注意递推的顺序是倒着推的,否则会计算重复的情况。
代码中第二重和第三重循环的顺序可互换。
// Created by Chenhongwei in 2015.
// Copyright (c) 2015 Chenhongwei. All rights reserved.
#include "iostream"
#include "cstdio"
#include "cstdlib"
#include "cstring"
#include "climits"
#include "queue"
#include "cmath"
#include "map"
#include "set"
#include "stack"
#include "vector"
#include "sstream"
#include "algorithm"
using namespace std;
const int inf=1e8;
const int maxn=1120;
typedef long long ll;
int cnt=0;
int p[5000],dp[maxn+10][20];
int main()
{
//ios::sync_with_stdio(false);
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
for(int i=2;i<=maxn;i++)
{
int flag=1;
for(int j=2;j*j<=i;j++)
if(i%j==0)
{
flag=0;
break;
}
if(flag)p[++cnt]=i;
}
memset(dp,0,sizeof dp);
dp[0][0]=1;
for(int i=1;i<=cnt;i++)
for(int j=14;j>=1;j--)
for(int k=maxn;k>=p[i];k--)
dp[k][j]+=dp[k-p[i]][j-1];
int n,m;
while(cin>>n>>m&&(n+m))
cout<<dp[n][m]<<endl;
return 0;
}