0%

背包问题记录方案数量

题目是求 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];
}