Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 求最小值和最大值,其中一项是数组nCr组合的和,另一项是剩余项的和_Assembly_Arm_Bit Manipulation_Combinatorics_Set Theory - Fatal编程技术网

Assembly 求最小值和最大值,其中一项是数组nCr组合的和,另一项是剩余项的和

Assembly 求最小值和最大值,其中一项是数组nCr组合的和,另一项是剩余项的和,assembly,arm,bit-manipulation,combinatorics,set-theory,Assembly,Arm,Bit Manipulation,Combinatorics,Set Theory,假设您得到一个名为NUMBERS的有符号整数数组,其长度r。说数字等于 1,2,3,4,5 其中r=5 您想要形成集合数字的任何n元素的和X,并将其乘以任何给定n的剩余m元素的和Y。所以数字数组的长度是(n+m)内存中的单词 这笔款项的形式如下: (x1+x2+x3+…+xn)*(y1+y2+…+ym) 例如,使用n=2时,X可能是任意n=2元素1和4的总和,因此剩余m=3元素的总和Y可能是2+3+5。然后将两个和相乘得到:X*Y=5*10=50 正式: 给定(n+m)有符号整数,我们希

假设您得到一个名为
NUMBERS
的有符号整数数组,其长度
r
。说
数字
等于

1,2,3,4,5

其中
r=5

您想要形成集合
数字
的任何
n
元素的和X,并将其乘以任何给定
n
的剩余
m
元素的和Y。所以
数字
数组的长度是
(n+m)
内存中的单词

这笔款项的形式如下:

(x1+x2+x3+…+xn)*(y1+y2+…+ym)

例如,使用
n=2
时,X可能是任意
n=2
元素
1
4
的总和,因此剩余
m=3
元素的总和Y可能是
2+3+5
。然后将两个和相乘得到:
X*Y=5*10=50


正式:

给定
(n+m)
有符号整数,我们希望最小化和最大化形式的代数表达式的结果:

(x1+x2+x3+…+xn)*(y1+y2+…+ym)

对于给定的固定
n


这涉及到查找给定了
n
的集合
数字的所有
nCr
组合,然后查找每个组合的总和X,然后计算未用于总和X的剩余元素的总和Y。然后将两者相乘。使用组合数学
nCr
公式,您可以获得可能的组合数X和相应的和Y,然后强制执行每一次乘法,以查看哪一次将产生最小或最大的结果


我不知道如何继续,特别是因为递归和嵌套for循环超出了第一个项目的范围。

我添加了一条注释,但在意识到我犯了错误时将其删除。然而,我做了更多的实验。我添加它作为一个答案,以便能够使用格式

我没有做过广泛的实验,所以我不能保证它在所有情况下都成立,但我做的测试表明,如果你对一组数字进行排序,那么这个事实似乎成立(当n A{1,3,4,6,8}和n=2时,那么:

minval = (A[0] + A[1]) * (A[2] + A[3] + A[4]) = 72
maxval = (A[0] + A[4]) * (A[1] + A[2] + A[3]) = 135
在我的实验中,我使用了从len=4到len=8的集合长度。这些实验表明,对于这些集合长度,上述假设似乎始终成立,并且随着n从n=2到n=(set.length-2)(对于n=1(和n=(set.length-1))的变化,答案是显而易见的).For set.length=3似乎略有不同,但每次使用此组合都会给出最小值和最大值

因为它适用于设定长度4到8,所以我假设对于大于8的设定长度也是如此

设置长度为3是一种“边缘案例”,但如果排序为(或不是直接的边缘案例,而是n>m),则仍然一致:

将长度设置为1和2(如果存在)是简单的情况

因此,如果上述情况始终成立,您只需对列表进行排序,然后根据上述情况计算最小值和最大值,我想这会使事情简化很多

编辑:排序后或排序前,您可以计算集合的和。然后您只需要执行以下操作:

x1 = (A[0] + A[1])
x2 = (A[0] + A[4])
minval = x1 * (totalsum - x1) = 72
maxval = x2 * (totalsum - x2) = 135

EDIT2:在进一步的实验之后,似乎上述情况在上述所有情况下都不成立,但有一种模式可以确保您可以利用。

嵌套for循环与非嵌套for循环完全相同,您只需为每个级别使用不同的寄存器。因此不应排除这种情况。为什么要将其标记为
assembly
?它被标记为汇编,因为我需要用arm汇编语言实现它。如果您认为应该删除它,我将删除它
minval = A[1] * (A[2]) * A[3]
maxval = (A[1] + A[2]) * A[3]
x1 = (A[0] + A[1])
x2 = (A[0] + A[4])
minval = x1 * (totalsum - x1) = 72
maxval = x2 * (totalsum - x2) = 135