质数拆分--记忆化搜索

 

【问题描述】

  将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;
}

 

posted @ 2021-03-19 20:17  荣荣荣荣荣荣  阅读(64)  评论(0)    收藏  举报