Java 使用给定整数数组达到目标和的算法,从而避免某些数字?
本练习是一个简单且具有挑战性的Java程序。输入包括:Java 使用给定整数数组达到目标和的算法,从而避免某些数字?,java,arrays,algorithm,Java,Arrays,Algorithm,本练习是一个简单且具有挑战性的Java程序。输入包括: 数组“n”的大小 数组A和A的输入 大小为“n-1”的另一个数组B的输入 “finalsum”是数组A中所有元素的总和 打印数组A中所有元素的正确相加顺序以达到最终和(即“finalsum”)的最正确算法是什么,这样我们就可以避免求和到数组B中的任何值 Inputs: (split to three lines for clarity) 1. 3 //n, the size of the array 2 4 6
Inputs: (split to three lines for clarity)
1.
3 //n, the size of the array
2 4 6 //array a of size n
4 8 //array b of size n-1
//finalsum = 2 + 4 + 6 = 12. Similarly for the 2nd input
Output: 0 1 2 (or) 2 1 0 is also correct
but 1 0 2 is wrong because it cannot add up to 4, since 4 is present in the array b
2.
20
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
209 208 207 206 205 204 203 202 201 200 199 198 197 196 195 194 193 192 191
Output: 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 (or) many other ways too
您的算法可能如下所示:
A
B
B
中,则跳到A
B
中,则递归从A
中选择下一个元素(删除当前元素)A
中的所有元素后,返回索引作为解决方案备份堆栈A
的所有元素都已经过测试,但没有解决方案,并且我们目前处于递归堆栈的最顶层,那么就得出没有解决方案的结论这些步骤中的大多数都应该相对简单地实现。为什么我们不能使用修改后的所有置换算法,其中检查每个步骤中的和。如果当前和等于B中的任何元素(为此,我们可以使用哈希映射),则不要继续,否则继续 希望我清楚
谢谢。这是家庭作业问题吗?是箱子包装问题。查找它。我已尝试解决该问题,它对某些输入有效,但它会导致ArrayIndexOutOfBoundsException错误。对于其他输入,我不了解消除程序此错误所需的条件。必要的条件是避免索引超出数组边界
如果(index>=array.length)执行其他操作
程序必须遵循始终返回良好顺序的算法,而不是测试每个排列,这是构建程序的条件之一。此外,输入最多可以变化100,因此测试每个组合的速度会非常慢,这不是预期的。@Suraj返回一个好顺序,而不是测试每个排列
这里你所说的好顺序是什么意思?我认为你需要所有的数字排列,其中中间和不等于B中的任何数字。以稍微不同的方式尝试了这种方法,即通过将数组视为集合并对其执行集合运算。仅适用于某些输入,而其他一些输入则会出现arrayindexoutofBounds异常。您试图访问数组范围之外的数组索引的某个位置:)您是否尝试在IDE中使用调试器查看其发生的确切位置?当您指的是A
,因为它们的大小相差1,您是否可能无意中提到B
?或者在您的集合逻辑中可能有一个逻辑错误,或者一个off-by-1索引错误?有很多原因,但它将出现在代码中,而不是算法中。好吧,根据你的逻辑,如果在递归过程中的某个时刻,A中的所有值,当添加到“当前和”中时,给出了B中存在的值,那么我们不能简单地再次跳过,因为A中不会有更多的元素添加到“当前和”中,此部分生成ArrayIndexOutOfBounds异常。此外,在这种情况下,这并不一定意味着没有可用的订单,这完全是错误的,而是程序试图生成的订单结果是错误的,但是,在给定限制的情况下,每个输入仍然有一些正确的顺序。如果没有元素可以签入,但我们在堆栈的某个位置,那么您将返回到递归中的上一级(比如说一个空集,表示没有找到解)-我发现在我的粗略算法中,我并不完全清楚这一点。唯一一次得出没有解决方案的结论是,如果您已经用完了签入A
的元素,并且您也处于递归的最高级别。这与获取数组索引边界无关-无论您位于何处,在导航数组/集合/任何对象时都需要正确检查边界。