以下是我输入数据的示例:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="selector"></ul>
输出是:
5 // Number of 1D arrays, in this case we'll have array[5][3]
1 2 3 // Values of array[i][0..2]
1 1 1
1 0 0
1 1 0
2 1 0
问题是使用12 // Maximum sum ({1 2 3} + {1 1 1} + {2 1 0} = {4 4 4} = 12) - END SUM VALUES MUST BE EQUAL(4 4 4).
3 // Number of arrays used to get this sum
数组找到最大总和,而secod条件是使用最少数量的数组。如果n
我们停止算法。 (300是最大值)。这是我的代码,我得到了很好的答案,但它的时间复杂度是O(2 ^ n-1)。我认为以某种方式保存结果并且不能多次计算相同的事情是可能的,但我还不知道如何。
sum > 300
答案 0 :(得分:1)
这可能不是解决此问题的最佳算法,但它应该比O(2 ^ N)更快。
这个想法是在循环输入数组时记录所有可达总和。你可以使用一个字典,其密钥是可能总和的唯一散列,为了简单起见,我们假设密钥是一个连接三个总和的字符串,例如,总和[3,5,4] ]我们将使用密钥&#34; 003005004&#34; ,字典的值将是达到该总和的最小数组数。
所以在你的情况下:
1 2 3 => [001002003] =1
1 1 1 => [001001001] =1, [002003004]=2 (itself and use [001002003] from above)
1 0 0 => [001000000] =1, [002002003] =2, [002001001] =2, [003003004] =3
1 1 0 ...
2 1 0 ...
最后,您会发现[004004004] = 3,这是您的答案。
这看起来似乎也经历了所有组合,所以为什么它更快,因为每个数字的最大总和是300,所以在最坏的情况下,我们可能有301 ^ 3个键已填充并必须更新每个新输入数组的值。然而,这仍然是O(n),尽管有很大的常数,它仍然应该比O(2 ^ n)运行得快得多。 (如果求解300 ^ 3 * n = 2 ^ n,n约为30-ish)
简单的散列函数是* 301 * 301 + b * 301 + c
答案 1 :(得分:0)
我认为问题是iframe
1-D数组和数字m
,使用n
中的n
数组找到最大总和;
解决方案看起来很直接。将每个1-D数组的总和保存在一个单独的数组中,比如说m
sum[]
对此数组1 2 3 = 6
1 1 1 = 3
1 0 0 = 1
1 1 0 = 2
2 1 0 = 3
sum
并返回此数组的第一个6,3,3,2,1
元素的总和。