如何从多个数组中获取最大数字总和 - 排列不起作用(16!)

时间:2014-09-04 12:20:59

标签: java arrays algorithm permutation

昨天我询问了How to find the maximum possible sum of numbers in arrays drawn from a unique array index,我建议使用排列 - 它运行良好,但我不知道我的阵列比我想象的要大得多。我有像[16]那样大的数组 - 所以我有16个!我可以使用什么代替排列来获得最大可能的总和?

修改。这是我的阵列:

public static ArrayList<Double[]> tempArrayCreator() {
    ArrayList<Double[]> tempArray = new ArrayList<>();

    Double[] l1 = { 9.0, 13.5, 9.0, 9.0, 9.0, 13.5, 9.0, 13.5, 13.5, 13.5,
            9.0, 13.5, 13.5, 9.0, 13.5, 9.0 };
    Double[] l2 = { 6.0, 6.0, 13.5, 6.0, 9.0, 6.0, 6.0, 6.0, 6.0, 9.0, 6.0,
            6.0, 9.0, 9.0, 6.0, 9.0 };
    Double[] l3 = { 22.5, 22.5, 14.0, 22.5, 14.0, 22.5, 22.5, 22.5, 22.5,
            21.0, 22.5, 22.5, 21.0, 14.0, 22.5, 14.0 };
    Double[] l4 = { 6.0, 6.0, 7.0, 6.0, 7.0, 6.0, 6.0, 6.0, 6.0, 7.0, 9.0,
            6.0, 7.0, 7.0, 6.0, 7.0 };
    Double[] l5 = { 4.5, 6.75, 6.0, 4.5, 6.0, 6.75, 4.5, 4.5, 6.75, 9.0,
            4.5, 6.75, 9.0, 6.0, 6.75, 6.0 };
    Double[] l6 = { 6.0, 9.0, 5.0, 6.0, 5.0, 9.0, 6.0, 6.0, 9.0, 7.5, 6.0,
            9.0, 7.5, 5.0, 9.0, 5.0 };
    Double[] l7 = { 13.5, 13.5, 4.0, 13.5, 4.0, 13.5, 13.5, 13.5, 13.5,
            6.0, 13.5, 13.5, 4.0, 4.0, 13.5, 4.0 };
    Double[] l8 = { 4.5, 4.5, 4.0, 4.5, 4.0, 4.5, 4.5, 4.5, 4.5, 4.0, 4.5,
            4.5, 6.0, 4.0, 4.5, 4.0 };
    Double[] l9 = { 10.5, 10.5, 10.0, 10.5, 10.0, 10.5, 10.5, 10.5, 10.5,
            10.0, 10.5, 10.5, 10.0, 10.0, 10.5, 10.0 };
    Double[] l10 = { 11.25, 11.25, 3.0, 11.25, 3.0, 11.25, 11.25, 11.25,
            11.25, 3.0, 11.25, 11.25, 3.0, 3.0, 11.25, 3.0 };
    Double[] l11 = { 7.5, 11.25, 10.0, 7.5, 10.0, 11.25, 7.5, 11.25, 11.25,
            15.0, 7.5, 11.25, 15.0, 10.0, 11.25, 10.0 };
    Double[] l12 = { 7.5, 7.5, 12.0, 7.5, 8.0, 7.5, 7.5, 7.5, 7.5, 8.0,
            7.5, 7.5, 8.0, 8.0, 7.5, 8.0 };
    Double[] l13 = { 13.5, 13.5, 6.0, 13.5, 6.0, 13.5, 13.5, 13.5, 13.5,
            9.0, 13.5, 13.5, 9.0, 6.0, 13.5, 6.0 };
    Double[] l14 = { 9.0, 9.0, 8.0, 9.0, 8.0, 9.0, 9.0, 9.0, 9.0, 12.0,
            9.0, 9.0, 12.0, 8.0, 9.0, 8.0 };
    Double[] l15 = { 7.5, 7.5, 12.0, 7.5, 8.0, 7.5, 7.5, 7.5, 7.5, 8.0,
            7.5, 7.5, 8.0, 8.0, 7.5, 8.0 };
    Double[] l16 = { 18.0, 18.0, 10.0, 18.0, 10.0, 18.0, 18.0, 18.0, 18.0,
            15.0, 18.0, 18.0, 15.0, 10.0, 18.0, 10.0 };

    tempArray.add(l1);
    tempArray.add(l2);
    tempArray.add(l3);
    tempArray.add(l4);
    tempArray.add(l5);
    tempArray.add(l6);
    tempArray.add(l7);
    tempArray.add(l8);
    tempArray.add(l9);
    tempArray.add(l10);
    tempArray.add(l11);
    tempArray.add(l12);
    tempArray.add(l13);
    tempArray.add(l14);
    tempArray.add(l15);
    tempArray.add(l16);

    return tempArray;
}

3 个答案:

答案 0 :(得分:2)

具有置换的解决方案实际上是一种回溯解决方案:您计算所有可能的总和并获取最大总和。回溯总是给出正确的结果(因为它考虑了所有可能性)但是非常慢。

另一种方法是编写一个贪婪算法(简单快速,但在很多情况下失败)。

通过在谷歌上搜索,我发现通过应用所谓的匈牙利算法给出了解决问题的最佳解决方案:http://www.hungarianalgorithm.com/examplehungarianalgorithm.php在您的情况下,您试图找到最大总和(示例适用于最低金额)

答案 1 :(得分:0)

如果我说得对,你想要找到由另一个数组创建的最大数组总和,该数组包含所有元素,并且其索引将放在新数组中。

那么有多少阵列要去?无论如何不是很重要。 那么为什么不采用每个新阵列的最大值并添加它呢?你可能会想“我怎么知道元素将如何被填充?”。

好吧,因为您只对最大总和感兴趣,所以您只能考虑原始数组的最大N元素。你知道原始数组中的元素,对吧? 所以那些让我们说3(N = 3)数组的成像让每一个数组都成为这些N数字中的一个,那么你只需保留这些数据就可以了!

我不知道我是否遗漏了某些东西,但如果是这样的话,你不需要排列。如果没有,那么更好地解释一下情况。只需将较大的N数字相加即可。

编辑:

由于你有1616元素数组,你可以想象每个数组被分成更小的数组(每个数组为4个元素)。

int[] arr1 = {x, x, x, x, x, x, 16, x, 20, x, x, ,19, x, x, x, 17};

其中x是一个小于16的任意数字(4个最大数字中较小的一个)。 只要它们不在同一个索引中,它们将成为这四个数字中的每一个都无关紧要。因此,您可以假设存在(多个)情况,它们不在同一个索引中,因此总和只是这4个数字的总和。 一种可能的排列可能是(但是具有上述条件的任何其他排列都可以):

int[] smallArr1 = {x, x, x, 16};
int[] smallArr2 = {x, x, 17, x};
int[] smallArr3 = {x, 19, x, x};
int[] smallArr4 = {20, x, x, x};

所以sum只是

int sum = 16 + 17 +19 + 20;

无论如何。

答案 2 :(得分:0)

我希望我不会误解你,但我的解决办法是从每个ArrayIndex中抽出最大值然后总结它们,因为最大的结果包括所有最大的元素

public double maxPossibleSum(ArrayList<Double[]> lists) {

    double result = 0.0;

    for (int i = 0; i < lists.get(0).length; i++) {

    double biggest = lists.get(0)[i];

        for (int j = 1; j < lists.size(); j++) {

            if(lists.get(j)[i] > biggest){ //Find 

                biggest = lists.get(j)[i];
            }

            result += biggest;
        }
    }

    return result;
}