质数拆分--记忆化搜索
【问题描述】
将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; }