题目是求 2019 可以由多少个两两不同的质因数组成,可以转化为 01 背包模型,将每个质因数的价值和花费等同于其数值大小。那么问题就简单变为了求 01 背包的方案数量。
代码如下
注意初始化 dp[0] =1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int INF = 0x3f3f3f3f; const int maxn = 3000; int isp[maxn]; vector<int> prime; void seive() { isp[0] = isp[1] = 0; for (int i = 2; i < maxn; i++) { isp[i] = 1; } for (int i = 2; i < maxn; i++) { if (isp[i]) { prime.push_back(i); for (int j = i + i; j < maxn; j += i) { isp[j] = 0; } } } } int main() { std::ios::sync_with_stdio(false); freopen("data.in", "r", stdin); seive(); int dp[maxn]; memset(dp, 0, sizeof(dp)); dp[0] = 1; for (int i = 0; i < prime.size(); i++) { for (int j = 2019; j >= prime[i]; j--) { dp[j] += dp[j - prime[i]]; } } cout << dp[2019]; }
|