Комбинаторика - C#

Формулировка задачи:

Здравствуйте. Помогите решить задачу Перечислить все способы выбора k чисел из множества 1..N. Повторения не допускаются, т.е. способ выбора должен отличаться по составу, а не по порядку следования.

Код к задаче: «Комбинаторика - C#»

textual
 private static void Main(string[] args)
        {
            var arr = new[] { 45, 12, 16, 17, 34 };
            int k = 3;
            var a = new int[k];
            Console.WriteLine("Кол-во сочетаний: {0}", C(arr.Length, k));
            Console.Write("Подмножество {0}: ", 1);
            for (int i = 0; i < k; ++i)
            {
                a[i] = i;
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine();
 
            int t = 1;
            while (NextCombination(a, arr.Length - 1))
            {
                Console.Write("Подмножество {0}: ", ++t);
                for (int i = 0; i < k; ++i)
                    Console.Write(arr[a[i]] + " ");
                Console.WriteLine();
            }
 
            Console.ReadLine();
        }
 
        private static int C(int n, int k)
        {
            if (n < k || n < 1 || k < 1)
                return 0;
            if (n == k)
                return 1;
            if (k == 1)
                return n;
            return C(n - 1, k - 1) + C(n - 1, k);
        }
 
        private static bool NextCombination(int[] a, int n)
        {
            int k = a.Length;
            for (int i = k - 1; i >= 0; --i)
                if (a[i] < n - k + i + 1)
                {
                    ++a[i];
                    for (int j = i + 1; j < k; ++j)
                        a[j] = a[j - 1] + 1;
                    return true;
                }
            return false;
        }

14   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ