Project Euler 249
Project Euler 249
题目
Prime Subset Sums
Let \(S = \{2, 3, 5, \dots, 4999\}\) be the set of prime numbers less than \(5000\).
Find the number of subsets of \(S\), the sum of whose elements is a prime number.
Enter the rightmost \(16\) digits as your answer.
解决方案
我们使用动态规划的思想解决集合的计数问题。
令\(N=5000,M\)为小于\(N\)的质数个数。
通过筛法找出质数后,存放在数组\(pr\)中。令\(f(i,j)(0\le i\le M,0\le j\le \sum_{k=1}^i pr[k])\)为前\(i\)个质数组成的集合中,有多少个和为\(j\)的子集。不难列出如下状态转移方程:
\[ f(i,j)= \left \{\begin{aligned} &1 & & \text{if}\quad i=0\land j=0 \\ &f(i-1,j) & & \text{else if}\quad j<pr[i] \\ &f(i-1,j)+f(i-1,j-pr[i]) & & \text{else} \end{aligned}\right. \]
这是一个较为典型的01背包问题,对于方程最后一行,\(pr[i]\)要么被使用了,将所有\(f(i-1,j-pr[i])\)的所有方案都添加一个\(pr[i]\);要么没被使用,直接从上一次的状态\(f(i-1,j)\)直接记录。
最终答案为\(\sum_{j\in pr}f(M,j)\)。
代码
1 |
|