【问题标题】:Sort an array which results in maximum product of elements对数组进行排序,从而产生最大元素乘积
【发布时间】:2014-08-02 05:47:32
【问题描述】:

我正在解决一个问题,该问题涉及将整数数组作为用户的输入。该程序计算数组元素的乘积。计算如下: 例如,让输入为 56、61、2。然后程序首先执行56 * 61 = 3416,然后执行modulo 3416 with 199 = 33。现在取数组中的下一个元素,即 2,并将其乘以 33 = 66。结果将是 3416 + 33 = 3482。这是isotopes atom 的计算。 现在,如果我们可以重新排列数组的元素,即 61、2、56;我们可以得到最大的产品如下:

61 * 2 = 122
122 * 56 = 6832
6832 + 122 = 6954

我已经编写了一个程序,它可以简单地计算输入数组的乘积,但现在我想如上所述对数组进行排序。我的程序如下:

import java.util.*;
public class codevita1 {
    public static void main (String []args) {
        int num = 0;
        try {
            num = Integer.parseInt (args[0]);
        } catch (Exception e) {
            System.err.println ("Arguments not enough");
        }
        int arr[] = new int[num];
        for (int i = 1; i <= num; i++) {
            arr[i-1] = Integer.parseInt(args[i]);
        }
        new codevita1().calcEnery (arr);
    }

    private int calcEnergy (int elements[]) {
    int energy = 0;
    int t = 1;
    for (int i = 0; i < elements.length; i++) {
        if (i == 0) {
            energy = (elements[i] * elements[++i]);
        } else {
            energy += (t * elements[i]);
        }
        t = energy % 199;
    }
    return energy;
}
}

我搜索了动态编程和分治算法,但我不明白哪种算法可以帮助我完成任务。请帮助我了解我应该使用哪种算法以及如何使用?

【问题讨论】:

  • 你能稍微解释一下你的帖子中关于“现在如果我们可以重新排列数组的元素,即 61、2、56;我们可以实现最大乘积如下:”因为在这一行之前你已经有了“结果将是 3416 + 33 = 3482”
  • 观察第一个结果之前的元素顺序,即56,61,2,观察第一个结果之后的元素顺序,即61,2,56。操作按顺序进行仅方式(如数组)。
  • 您或许应该删除该算法的英文解释,因为我在一次阅读中无法理解它......你有calcEnergy方法中的代码,我认为它是正确的,对于那些不真正了解 Java 的人来说似乎已经足够清楚了。因此,只需显示不同数字顺序的示例结果。或者在Java之外写伪代码。
  • 也许我可以给出完整的定义,但它太长了,所以我已经尽力用最短的形式解释算法。 50%的工作已经完成;只是重点仍然是如何重新排列数组以实现元素的最大乘积。
  • 我很确定您的 calcEnergy 公式不正确,因为我对每个排列都得到了相同的值。似乎在某处缺少模数,也许还有其他东西。根据后记代码的样子,我想到了一种可行的方法。

标签: java arrays algorithm sorting dynamic-programming


【解决方案1】:

简单的方法是检查每个排列,这需要 O(n!) 时间。

您还可能注意到 (a%199 * b)%199 = (a * b) %199 它允许我们检查将一组数字拆分为两个几乎相等的子集的各种方法。 当我们检查拆分方法时,我们可以计算在计算第一个子集的能量后剩余的 t,它只是第一个子集 % 199 中所有数字的乘积,无论子集中元素的顺序如何,它都将保持不变。 然后我们可以递归地计算两个子集的最优顺序。

如果子集的顺序很重要,有 C(n,n/2) 种方法可以将 n 个数字分成两个子集。 C(n,n/2)

我怀疑拆分为更多子集(更准确地说是每个子集的 sqrt(n) 子集 sqrt(n) 元素)可能会更好,但还没有计算这种情况的复杂性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2017-02-02
    • 2019-10-24
    • 2018-03-08
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多