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

本练习是一个简单且具有挑战性的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         //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
    的元素,并且您也处于递归的最高级别。这与获取
    数组索引边界无关-无论您位于何处,在导航数组/集合/任何对象时都需要正确检查边界。