如何在列表中查找具有相同总和的所有整数组合?

时间:2018-08-26 19:55:39

标签: javascript c# php algorithm graph

例如,我有1,2,3,4,5,6,7,8,9,并希望找到所有等于100的可能组合,并使用(加,减,串联)等运算。考虑到+运算,这样的组合之一就是[1 + 23-4 + 56 + 7 + 8 + 9 = 100]。

1 个答案:

答案 0 :(得分: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