Efficient algorithm to find a combination, which summation is equal to a known number, in a set of number

后端 未结 2 1358
青春惊慌失措
青春惊慌失措 2020-12-14 04:33

Let\'s say there is a set of number

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

I want to find out several combinations in the set of number s

相关标签:
2条回答
  • 2020-12-14 05:11

    A possible alternative method. With a small set like this, you could use brute force. Your set {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} has 10 elements, and each element can be present or not present. That can be mapped to a binary number between 0 (= 0b0000000000) and 1023 (= 0b1111111111). Loop through the numbers from 0 to 1023, inclusive, and check the sum for the subset corresponding to the set bits of the binary representation of the number.

    Maybe not the most useful for this particular question, but a good way to generate all possible subsets of a given set.

    0 讨论(0)
  • 2020-12-14 05:25

    You can use recursion. For any given number in the set, find the combinations of smaller numbers that adds up to the number:

    public static IEnumerable<string> GetCombinations(int[] set, int sum, string values) {
      for (int i = 0; i < set.Length; i++) {
        int left = sum - set[i];
        string vals = set[i] + "," + values;
        if (left == 0) {
          yield return vals;
        } else {
          int[] possible = set.Take(i).Where(n => n <= sum).ToArray();
          if (possible.Length > 0) {
            foreach (string s in GetCombinations(possible, left, vals)) {
              yield return s;
            }
          }
        }
      }
    }
    

    Usage:

    int[] set = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
    foreach (string s in GetCombinations(set, 18, "")) {
      Console.WriteLine(s);
    }
    

    Output:

    1,2,4,5,6,
    3,4,5,6,
    1,2,3,5,7,
    2,4,5,7,
    2,3,6,7,
    1,4,6,7,
    5,6,7,
    1,2,3,4,8,
    2,3,5,8,
    1,4,5,8,
    1,3,6,8,
    4,6,8,
    1,2,7,8,
    3,7,8,
    2,3,4,9,
    1,3,5,9,
    4,5,9,
    1,2,6,9,
    3,6,9,
    2,7,9,
    1,8,9,
    1,3,4,10,
    1,2,5,10,
    3,5,10,
    2,6,10,
    1,7,10,
    8,10,
    
    0 讨论(0)
提交回复
热议问题