【问题标题】:How to find all combinations of integers in a list that have the same sum? [closed]如何找到列表中具有相同总和的所有整数组合? [关闭]
【发布时间】:2019-02-01 10:18:47
【问题描述】:

例如,我有 1,2,3,4,5,6,7,8,9,并希望通过(加、减、连接)之类的操作找到等于 100 的所有可能组合。考虑 + 运算,这样的组合之一是 [1 + 23 - 4 + 56 + 7 + 8 + 9 = 100]。

【问题讨论】:

  • 同一个号码可以用两次吗?
  • 请选择您使用的语言,请show your efforts
  • 是的,我们可以使用相同的数字,但不能使用相同的组合,对不起 Camilo Terevinto,但我不知道如何做到这一点,这就是我不发布任何代码的原因。语言无关紧要,我在 php 中需要它,但我只需要算法。提前致谢。
  • 这将是一个尝试解决的有趣问题,但我相信它会在我或其他任何人有时间发布答案之前关闭。

标签: javascript c# php algorithm graph


【解决方案1】:

首先,让我们生成所有可能的公式(你没有很多,只有3**9 == 19683):C#代码在这里和下面

private static IEnumerable<string> Formulas() {
  string[] delimiters = new string[] {
    "", "", "", "", "", "", "", "", "",
  };

  do {
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < delimiters.Length; ++i) {
      sb.Append(delimiters[i]);
      sb.Append(i + 1);
    }

    yield return sb.ToString().TrimStart('+');

    for (int i = 0; i < delimiters.Length; ++i) {
      if (delimiters[i] == "") {
        delimiters[i] = "+";
        break;
      }
      else if (delimiters[i] == "+") {
        delimiters[i] = "-";
        break;
      }
      delimiters[i] = "";
    }
  }
  while (delimiters.Any(item => !string.IsNullOrEmpty(item)));
}

然后,让我们计算相应的值(借助正则表达式,我们可以从公式中提取每个数字)并过滤掉所需的值:

Regex reg = new Regex(@"(?:\-|\+)?[0-9]+");

int sumUpTo = 100;

var result = Formulas()
  .Distinct()             // +123456789 == 123456789
  .Where(formula => reg
    .Matches(formula)
    .OfType<Match>()
    .Select(match => int.Parse(match.Value))
    .Sum() == sumUpTo);

最后,让我们打印出result

Console.Write(string.Join(Environment.NewLine, result));       

结果:

123-45-67+89
12-3-4+5-6+7+89
12+3+4+5-6-7+89
123+4-5+67-89
-1+2-3+4+5+6+78+9
1+2+3-4+5+6+78+9
12+3-4+5+67+8+9
1+23-4+56+7+8+9     // <- the sample answer in the question
1+2+34-5+67-8+9
1+23-4+5+6+78-9
123+45-67+8-9
123-4-5-6-7+8-9

【讨论】:

  • 我不喜欢 TrimStart+Distinct 方法,因为它将所有生成的组合一起存储在内存中。更改生成器以避免重复会更合适恕我直言(delimiters[i] = i==0 ? "-" : "+";)。
猜你喜欢
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
相关资源
最近更新 更多