2016-10-19 2 views
0

Мне нужно найти все подмножества чисел, чтобы получить номер N путем суммирования его элементов. Я не знаю, как пройти эту проблему с комбинацией. В этой комбинации порядок имеет значение для разных чисел.Как найти все подмножество, которое суммирует его элементы, равно постоянному числу?

пример для числа N = 4

1 + 1 + 1 + 1 
2 + 1 + 1 
1 + 2 + 1 
1 + 1 + 2 
2 + 2 
3 + 1 
1 + 3 

Нули не важны для меня. Итак, как я могу получить такие числовые множества, как массив для точного числа?

+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. Также покажите нам, что вы сделали до сих пор – Marusyk

+1

Выглядит подозрительно, как домашнее задание. Независимо от того, вы должны предоставить то, что вы пробовали до сих пор, SO не слишком долго продолжает решать ваши алгоритмы без какой-либо попытки частично. – GEEF

+0

Неразумно говорить такие вещи. Я пытаюсь разработать турецкую игру под названием 101 OKEY. В этой игре есть 21 плитка, поэтому я дал точное число по этой причине. И мне нужны комбинации, чтобы рассчитать лучшую точку, отделяющую черепицу от разных точек. –

ответ

1

То, что вы ищете, называется целым числом compositions или заказано partitions.

Композиции могут быть получены рекурсивно (в лексикографическом порядке, если я не ошибаюсь) следующим образом:

public static IEnumerable<List<int>> Compositions(int n) 
{ 
    if (n < 0) 
     throw new ArgumentOutOfRangeException(nameof(n)); 

    return GenerateCompositions(n, new List<int>()); 
} 

private static IEnumerable<List<int>> GenerateCompositions(int n, List<int> comp) 
{ 
    if (n == 0) 
    { 
     yield return new List<int>(comp); // important: must make a copy here 
    } 
    else 
    { 
     for (int k = 1; k <= n; k++) 
     { 
      comp.Add(k); 

      foreach (var c in GenerateCompositions(n - k, comp)) 
       yield return c; 

      comp.RemoveAt(comp.Count - 1); 
     } 
    } 
} 

Не тестировался! Это было расшифровано из реализации Python. Если кто-то хочет внести исправления или обновить код с более идиоматическим C#, не стесняйтесь.

Кроме того, as @aah noted, количество композиций n является 2^(n-1), так что это становится громоздким даже для скромной n.

+0

Ваш код верен. Не нужно исправлять. Благодаря! –

0

Если заказ не имеет значения, есть только 2^(N-1) возможности. (В вашем примере нет 2 + 2 или 4)

Затем вы можете представить любую последовательность по его двоичному представлению. Чтобы генерировать, представьте N 1 в строке, так что между ними есть N-1 «пробелы». Выбирая любое подмножество пространств, вы объединяете любые 1, которые смежны через выбранное пространство. Вы можете проверить, что это 1-1 для всех возможных наборов, расширяя любую такую ​​последовательность и вставляя эти пробелы.

Смежные вопросы