Arrays 如何使总和最大化?

Arrays 如何使总和最大化?,arrays,algorithm,sorting,implementation,Arrays,Algorithm,Sorting,Implementation,我们得到一个排序数组 让pass的初始值为零 我们可以多次执行以下操作: 一次选择任意k数字。把它们都加起来。将此总和添加到pass 如果第一次从数组中选择了一个数字,例如x,则该数字仅被视为x。第二次选择时,它被视为-x,第三次被视为x,依此类推 例如,让数组为[-14,10,6,-6,-10,-10,-14]和k=4,我们只执行一次操作。我们选择这4个数字:{14,10,6,-6}。把它们加起来,我们得到24个。然后,pass=pass+24。因此,通过的最大值为24 如何获得通过的最大值?

我们得到一个排序数组

pass
的初始值为零

我们可以多次执行以下操作:

  • 一次选择任意
    k
    数字。把它们都加起来。将此总和添加到
    pass

  • 如果第一次从数组中选择了一个数字,例如
    x
    ,则该数字仅被视为
    x
    。第二次选择时,它被视为
    -x
    ,第三次被视为
    x
    ,依此类推

  • 例如,让数组为
    [-14,10,6,-6,-10,-10,-14]
    k=4
    ,我们只执行一次操作。我们选择这4个数字:
    {14,10,6,-6}
    。把它们加起来,我们得到24个。然后,
    pass=pass+24
    。因此,通过的最大值为
    24


    如何获得通过的最大值?

    我们可以将问题重新表述如下:

    我们有一个号码列表,我们可以激活或停用号码。我们希望找到激活的数字的最大总和,在每次过程中,我们可以精确地切换
    k
    数字

    对于奇数
    k
    ,我们可以执行以下操作:激活最大数(如果为正数),并使用剩余的
    (k-1)
    开关切换任意数两次,这将有效地使该数保持其先前的状态。因此,最大
    pass
    值是正数之和

    对于偶数
    k
    ,这略有不同,因为激活号码的数量始终为偶数。因此,我们首先找到所有的正数。让正数的数目为
    p
    。如果
    p
    是偶数,那么我们是好的,这些数字的总和就是结果。如果
    p
    为奇数,我们必须检查两种情况:删除最小的正数或添加最大的非正数。这两种情况的最大值就是结果

    根据评论编辑:


    对于
    k=n
    的特殊情况,只有两个选项:包括所有数字或排除所有数字。如果数字之和大于0,则为结果。否则,结果为0。

    对于家庭作业类型的问题,请参见如何提问。具体来说,请提供您已经尝试过的内容的信息,并提供一个。我的第二点仍然站不住脚。如果对运算次数没有限制,那么在无休止的加法之后可能会得到最大和。不,您的逻辑不正确。有限的移动次数就足够了。@Firexsecred这听起来好像您已经有了一个解决方案。是这样吗?评论不是为了进一步讨论;这段对话已经结束。