【发布时间】:2017-11-17 10:34:29
【问题描述】:
如何找到一个从 2 到 1000 的数字子集,在该子集中的任何两个数字不共享共同的质因数(例如,1000 和 500 共享质因数 2)的条件下,它会给您最大和?
上述问题的一个(可能更容易)变体:子集中的最大数字是多少?我们知道 997 是一个素数,很容易排除 1000 和 998,那么问题就变成了 999 是否在子集中?
【问题讨论】:
-
这是一个难题。您应该在这里使用动态编程技术。在算法结束之前,您无法知道您是否选择了正确的数字,因此您需要找到方法从可能的选择中消除数字,然后再选择它们并计算新的总和。但首先,您可以开始选择从
sqrt(1000)到1000的所有素数,然后只比较不在该集合中的素数。 -
“排除1000和998很容易”真的吗?为什么?
-
@Henrik:因为它们有一个共同的因数,即 2。
-
euclidean algorithm for the greatest common divisor function 是一种快速算法,用于确定任何两个整数是否共享一个公因数。您正在寻找总和最大化的成对相对素数的子集。一个这样的集合是显而易见的:[2...1000] 中所有素数的集合。请注意,使用欧几里得算法可能不是这个问题的最佳选择;根据您的解决方案,最好使用筛子完全分解每个整数。
-
@Henrik: 1000=2^3 * 5^3,但 512 + 625 > 1000; 998=2*499,但 512 + 499 > 1000。
标签: math max primes combinatorics subset-sum