昨天我询问了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;
}
答案 0 :(得分:2)
具有置换的解决方案实际上是一种回溯解决方案:您计算所有可能的总和并获取最大总和。回溯总是给出正确的结果(因为它考虑了所有可能性)但是非常慢。
另一种方法是编写一个贪婪算法(简单快速,但在很多情况下失败)。
通过在谷歌上搜索,我发现通过应用所谓的匈牙利算法给出了解决问题的最佳解决方案:http://www.hungarianalgorithm.com/examplehungarianalgorithm.php在您的情况下,您试图找到最大总和(示例适用于最低金额)
答案 1 :(得分:0)
如果我说得对,你想要找到由另一个数组创建的最大数组总和,该数组包含所有元素,并且其索引将放在新数组中。
那么有多少阵列要去?无论如何不是很重要。 那么为什么不采用每个新阵列的最大值并添加它呢?你可能会想“我怎么知道元素将如何被填充?”。
好吧,因为您只对最大总和感兴趣,所以您只能考虑原始数组的最大N
元素。你知道原始数组中的元素,对吧?
所以那些让我们说3(N = 3
)数组的成像让每一个数组都成为这些N
数字中的一个,那么你只需保留这些数据就可以了!
我不知道我是否遗漏了某些东西,但如果是这样的话,你不需要排列。如果没有,那么更好地解释一下情况。只需将较大的N
数字相加即可。
编辑:
由于你有16
个16
元素数组,你可以想象每个数组被分成更小的数组(每个数组为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;
}