2019第十屆藍橋杯大賽C++B組 試題 B: 質數拆分

【問題描述】
將 2019 拆分爲若干個兩兩不同的質數之和,一共有多少種不同的方法? 注意交換順序視爲同一種方法,例如 2 + 2017 = 2019 與 2017 + 2 = 2019 視爲同一種方法。

題目其實不難,自己比賽的時候也是想到做法了,結果算出來的數賊大,感覺自己算錯了。。。哎。。
做法:(可能不是最佳的做法)
先獲得2019內的所有素數,然後就是一個從N個數裏面湊成M的個數的題目了。
類似leetcode 494 目標和的題目了。直接01揹包
dp[j]=dp[ja[i]]+dp[j]dp[j] = dp[j-a[i]] + dp[j]dp[j]表示j能湊成的種類數。a[i]表示第i個素數。
代碼如下:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAX = 3000;
ll dp[MAX];
bool isprime(ll x){
    if(x < 2)   return false;
    else if(x == 2) return true;
    else{
        for(ll i=2;i*i<=x;++i){
            if(x % i == 0)
                return false;
        }
        return true;
    }
}
void solve(ll num){
    vector<ll> vec;
    for(ll i=1;i<=num;++i){
        if(isprime(i))
            vec.push_back(i);
    }
    memset(dp,0,sizeof(dp));
    dp[0] = 1;
    for(int i=0;i<vec.size();++i){
        for(int j=num;j>=vec[i];--j){
            dp[j] += dp[j-vec[i]];
        }
    }
    printf("%lld\n",dp[num]);

}
int main(void){
    solve(2019);
    return 0;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章