如何解决您如何找到N个整数使其总和等于M?
如何找到N个不同整数的任何可能组合,以使它们的总和等于给定的整数M?
整数可以在-2 ^ 31到2 ^ 31之间,其中N小于或等于500000,M也在-2 ^ 31和2 ^ 31之间。
一个例子:
- 4表示为N,8表示为M。
- 可能的组合为3,-1、4、2
解决方法
假设N
很奇怪。我们可以选择非M的N/2
个正整数。我们还选择那些整数的负数。最后,我们选择M
。例如,如果N = 5
和M = 9
,我们可以选择2,-2,4,-4
。然后,我们简单地选择9
作为我们的最终整数,就得到M
的总和。
假设N
是偶数。我们可以使用类似的系统,但选择N/2-1
个正整数及其负的对应数0
,然后选择M
。因此,对于N = 6
,M = 11
,我们可以选择5,-5,6,-6,11
作为11
的总和。
这些选择不是唯一的,但是简单地选择连续的整数将是微不足道的。
,- 您为问题提供的四个整数之和不等于8。
- 正如您在问题中未提到的,我假设允许重复。您可以做的是将
M
分成相等的N-1
个分段(地板分割),第N个元素将是M - M/(N-1) * (N-1)
def findCombination(N,M):
if N == 1:
return M
ans = [(M/(N-1)) * (N-1)]
ans.append(M - M/(N-1) * (N-1))
return ans
更新: 截至目前,该问题已更新为仅允许使用不同的元素,您可以按照以下过程进行操作:
- 如果
N
为奇数: 开始选择绝对值相同但符号不同的值,例如1 -1 2 -2 3 -3
。在此过程中不要包括M。您可以选择N/2
个正元素和N/2
个负元素。您可以在其中添加的最后一个元素是M
。 - 如果
N
是偶数: 如上所述开始选择值。现在,您需要排除两个总计为M
的元素。因此,您可以排除1
和M-1
,然后将它们包括在最终答案中。
这是GO中的示例代码
package main
import (
"fmt"
)
func main() {
n,m := 15,10
fmt.Println(m)
if n == 1 {
return
}
n--
if n%2 != 0 {
fmt.Println(0)
n--
}
for i := 1; i < n; i += 2 {
fmt.Println(-i)
fmt.Println(i)
}
}
,
我认为这是一个复杂的问题,您必须进行一些蛮力循环,其中应从几个零开始,提取最大的数并加到任何其他数上。我认为顺序并不重要。
8 = 0 + 0 + 0 + 8
8 = 0 + 0 + 1 + 7
8 = 0 + 1 + 1 + 6
8 = 1 + 1 + 1 + 5
8 = 1 + 1 + 2 + 4
8 = 1 + 2 + 2 + 3
8 = 2 + 2 + 2 + 2
当然,您必须使用负数,因此请更深入(至-2 ^ 31)并执行以下操作:
8 = (-500) + (-500) + (-500) + 1508
8 = (-500) + (-500) + (-499) + 1507
8 = (-500) + (-499) + (-499) + 1506
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。