【问题描述】
将2019拆分为若干个两两不同的质数之和,一共有多少种不同的方法?
注意交换顺序为同一种方法,列如2 + 2019 = 2019 与 2017 + 2 = 2019 视为同一种方法。
#include <stdio.h>
#include <string.h>
int n, m;
int a[300500];
long long dp[2020][5000];
long long dfs(int x, int sum){
//printf("%d\t%d\n",x,sum);
if(dp[x][sum] != -1)return dp[x][sum];
if(sum == 2019)return 1;
if(x > m || sum > 2019)return 0;
long long ans = 0;
ans += dfs(x + 1, sum);
ans += dfs(x + 1, sum + a[x]);
return dp[x][sum] = ans;
}
void init(){
int i, j, k;
m = 0;
a[0] = 2;
for(i = 3; i <= 2019; i++){
k = i, flag = 0;
for(j = 2; j * j <= k; j++){
if(i % j == 0){
flag = 1;
break;
}
}
if(flag == 0){
a[++m] = i;
}
}
}
int main() {
memset(dp, -1, sizeof(dp));
init();
printf("%lld\n",dfs(0, 0));
return 0;
}