在数组中查找不重复的最大 GCD 和

问题描述

我有一个偶数元素的数组,我必须选择 n/2(n=数组大小),成对并计算它们的 GCD,使得它们的 GCD 总和是最大值,一旦我们使用数组中的这些元素,我们不能再次使用它们。

示例 1: `

输入:8 24 12 16

输出:20

说明:我们选择两对 (8,16) 和 (12,24) 作为它们的 GCD 之和最大。 如果我们选择其他一些对,比如 (8,12) 和 (24,16),它们的 GCD 和将是 4+4 =8。

示例 2:

输入:12 10 36 25 36 16

输出:45

说明:我们选择以下 3 对:(36,36)、(10,25) 和 (12,16) 作为它们的 GCD 之和为 36+5+4 = 45。

我们的方法

for i in range(0,n):
   max = 0;
   for j in range(i+1,n):
      temp = gcd(a[i],a[j]) // standard func to find GCD 
      if(max<temp):
         store i and j
      store max gcd every time and finally make a[i] and a[j] =0 to mark the visited elements

已编辑 约束:最大元素数 = 20,a[i]

您能否提出一种算法来以最小的时间复杂度最佳地满足上述测试用例? 因为我的方法在多个测试用例上都失败了。

解决方法

这是一条评论,但我还不能发表评论。 找最大的gcd来解决这个问题是不好的。 以 [8,9,24,36] 为例,最大的 gcd 是 gcd(24,36) = 12,这将得到 gcd(24,36) + gcd(8,9) = 12+1 =13。 然而,最大的和由 gcd(8,24) + gcd(9,36) = 8+9 = 17 给出。