假设您有一组如下所示的数字:
[A,B,C]
[6, 4.5, 6]
[7, 6, 5]
[9, 4.5, 6]
类别(A,B或C)中每组 AND 中只能使用一个数字来查找最大总和。在这种情况下,A = 9,B = 6和C = 6将产生21的最大总和。最大的总和不能是22(9 + 7 + 6),因为9和7都是A类冲突。
我怎样才能用Java做到这一点?
我无法找到最大的金额,因为在每个类别中选择最大值并不能保证最大的金额。某些类别可能会被强制为较小的值,从而减少总和。请记住,每个集合和类别中只能选择一个数字。
答案 0 :(得分:1)
听起来有点像Eight Queens Puzzle,你必须在棋盘上放置8个皇后,而没有任何一个在另一个棋盘上。 (如果你不认识国际象棋,不要担心比喻)。
假设您的示例数组:
[6, 4.5, 6]
[7, 6, 5]
[9, 4.5, 6]
找出整体最大值(在本例中为9),并阻止其列和行。
你的新数组看起来像这样(x作为选择不再有效)。
[x, 4.5, 6]
[x, 6, 5]
[x, x, x]
反复重复该过程,直到从每列和每行中选择一个值。
现在,作为警告,对于当前最大值具有多个位置(如示例的第二步,使用两个6)会导致更多条件。我将为您留下一些乐趣,但如果需要,我会乐意提供更多帮助。
<强> 警告 强>
正如Neil C.在评论中指出的那样,这个答案是无效的。 具体反例:
[10, 9, 1]
[ 9, 1, 1]
[ 1, 1, 1]
我还没有手头的修复程序,但我想留下这个答案,以便提供正确的解决方案。
答案 1 :(得分:0)
蛮力搜索的一种简单方法是生成长度为N的所有排列,其中N是类别数。然后,对于每个排列,计算所有i的Matrix[i][Permutation[i]]
之和并取最大值。
答案 2 :(得分:-2)
以下是关于我将如何做的一些想法。
假设您将数据存储在2d整数数组中
int [] [] data = new int [rows] [columns]
所以在这种情况下,列是A,B,C等。
搜索最大值时,您需要像这样迭代:
data[i][fix]
因此修复了列,并在循环中更改了行
在您的示例中,如果您想获得A
的最大值并使用像我建议的二维数组,那么:
int [] [] data = new int [3][3];
然后,A
,data [0][0]
和data[1][0]
data[2][0]
的最大值的集合
编辑:
这是一个可能的解决方案。
//here is our data array.
int [][] data = new int[3][];
//fill up with som random data
data[0] = new int[]{10,20,4,5,56,87,9};
data[1] = new int[]{1,65,0,10,3};
data[2] = new int[]{34,5,6,67,3,54};
//get the biggest arrays length
int maxArrayLength = 0;
for(int i=1; i<data.length; i++)
{
if(data[i].length > data[maxArrayLength].length)
maxArrayLength = i;
}
maxArrayLength = data[maxArrayLength].length;
//collect the max in each category
int [] categoryMax = new int[maxArrayLength];
//loop through the categories
for(int i=0; i<maxArrayLength; i++)
{
//in each iteration we get a winner
int categoryWinner = 0;
// now loop through the values of the current category
for(int j=0; j<data.length; j++)
{
int [] actualArray = data[j];
int [] winnerArray = data[categoryWinner];
//check if we are in the bounds, if so, then perform a simple maxsearch
if(i<actualArray.length)
if(actualArray[i] > winnerArray[i])
categoryWinner = j;
}
//set the current element of the winners array.
categoryMax [i] = data[categoryWinner][i];
}
int sum = 0;
// we are ready, print it out!
for(int i=0; i<categoryMax.length; i++)
{
System.out.println((i+1) + ". groups winner: " + categoryMax[i]);
sum+=categoryMax[i];
}
System.out.println(sum);