【問題描述】
將 2019 拆分爲若干個兩兩不同的質數之和,一共有多少種不同的方法? 注意交換順序視爲同一種方法,例如 2 + 2017 = 2019 與 2017 + 2 = 2019 視爲同一種方法。
題目其實不難,自己比賽的時候也是想到做法了,結果算出來的數賊大,感覺自己算錯了。。。哎。。
做法:(可能不是最佳的做法)
先獲得2019內的所有素數,然後就是一個從N個數裏面湊成M的個數的題目了。
類似leetcode 494 目標和的題目了。直接01揹包
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;
}