【问题标题】:How do you find N integers such that their sum equals to M?你如何找到 N 个整数,使得它们的总和等于 M?
【发布时间】:2020-08-25 18:57:06
【问题描述】:

您如何找到 N 个不同整数的任何可能组合,以使它们的总和等于给定整数 M?

整数可以介于 -2^31 到 2^31 之间,其中 N 小于或等于 500000,M 也介于 -2^31 和 2^31 之间。

一个例子:

  • 4 表示为 N,8 表示为 M。
  • 可能的组合是 3、-1、4、2

【问题讨论】:

  • 3 - 1 + 4 - 2 不等于 8,还是我遗漏了什么?
  • 到目前为止,YOU 尝试过什么?分享您的想法/代码。
  • 我可能打错了,对不起
  • 在 N=2 和 M=0 的情况下,已经有 2**31 个解决方案。真的是你想要的吗?

标签: algorithm combinations


【解决方案1】:

假设N 是奇数。我们可以选择N/2 不是 M 的正整数。我们也选择那些整数的负数。最后,我们选择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, 0, 11 和11。

这些选择不是唯一的,但简单地选择连续的整数是微不足道的。

【讨论】:

  • 我从来没有想过类似的解决方案,非常感谢您的解决方案!
  • @WillardSun 如果这可以解决您的问题。考虑将其标记为答案。
【解决方案2】:
  1. 您在问题中提供的四个整数加起来不等于 8。
  2. 正如您在问题中没有提到的,我假设允许重复。您可以做的是将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

更新: 截至目前,问题已更新,只允许使用不同的元素,您可以按照以下流程进行操作:

  1. 如果N 是奇数: 开始获取具有相同绝对值但具有不同符号的值,例如1 -1 2 -2 3 -3。在此过程中不要包含 M。您可以选择N/2 正元素和N/2 负元素。您可以包含的最后一个元素是 M。
  2. 如果N 是偶数: 如上所述开始选择值。现在您需要排除总和为M 的两个元素。因此,您可以排除 1 和 M-1,然后将它们包含在最终答案中。

【讨论】:

  • 哦,对不起,我的错。没想到哈哈
  • 同样不允许重复,它们应该是不同的整数,错误见谅
【解决方案3】:

这是 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)
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2016-08-23
    • 1970-01-01
    • 2021-11-27
    • 2014-10-17
    • 2018-04-19
    相关资源
    最近更新 更多