2016-03-02 5 views
0

Предположим, у меня есть четыре номера 0,1,1,3. Я хочу найти номер уникальной комбинации из двух чисел. Пожалуйста, помогите мне написать algo и код этого. Я знаю, что это скорее математический вопрос, но все же я должен написать код. Пожалуйста, помогите мне.Алгоритм для поиска числа комбинаций

+0

См Http: //www.cplusplus.com/reference/algorithm/next_permutation/ – Ultimater

+2

Вещь называется «Комбинация без повторения». Google it .. – lewiatan

+0

Посмотрите на [Комбинация] (https://en.wikipedia.org/wiki/Combination). – Jarod42

ответ

0

Вы должны использовать в себе комбинированную формулу. И вы должны написать для него факториальную функцию.

Предположим, например, у вас есть 4 номера, и вы хотите, число комбинаций без повторений, так что используйте 4С2

здесь 2 для количества элементов, которые вы хотите использовать в комбинации

4 тотально количество элементов, которые у вас есть

, так что вы можете решить это, используя 4!/(2 * (4-2)!!) .... поэтому этот расчет даст вам общее число комбинаций без повторений

Примечание: для уникальной комбинации вы должны иметь уникальные элементы

+0

Не так ли ** 4!/2! **, а? ** 4! ** дает вам количество перестановок, если было 4 уникальных предмета. Затем вы учитываете возможные перестановки двух 1s путем деления на ** 2! **. –

+0

Он хочет комбинацию, а не перестановку .. и он хочет узнать общее количество комбинаций без повторения. Приведенная формула используется для определения требований к вопросу :) – Nutan

+0

О, вы правы. Прости. Но не единственные комбинации (0,1), (0,3), (1,1), (1,3)? Ваша формула работает только в том случае, если в пуле есть отдельные элементы. –

0

простой псевдо-код для вас, чтобы сделать то, как это:

1- getInputs(std::vector<int> inputs) // ответственность читать входные данные от пользователя

2- removeDuplicates(std:vector<int> inputs) // удалить дубликаты из входов

calculateCombination(n = length(inputs)) 3- // если вы ищете комбинацию вы должны реализовать n!/((n-2)!*2!) или если вы ищете перестановку следует реализовать n!/(n-2)!

+1

OP также должен добавить количество повторяющихся номеров (в оригинале), как я понимаю, '{0, 1 , 1} 'должен создавать' {0, 1} '(только один раз) и' {1, 1} 'так 2. – Jarod42

+0

@ Jarod42: это правильно, однако это всего лишь псевдокод, чтобы дать общую идею, и потому Ассистент не упоминал никаких примеров, которые я оставляю ему, чтобы решить, что делать – Pooya

1

из вашего примера установить 0,1,1,3, я предполагаю, что вы хотите, чтобы дубликаты в входе, который делает это нахождение количества уникальных комбинаций сложнее.

Поскольку вы хотите только выбрать уникальные пары, это намного проще, чем выбор уникальных наборов n (по крайней мере, когда дубликаты разрешены).

Идея состоит в том, чтобы сначала удалить все дубликаты, сохраняя при этом то, как много входов имеют повторяющиеся значения.

Ты ответ будет тогда

n C 2 + m где n является # различных элементов и m является # элементов с дубликатами.

для 0,1,1,3, n = 3 и m = 1 Таким образом, вы получите 3 C 2 + 1 = 3 + 1 = 4

(0, 1), (0, 3), (1, 1), (1, 3) 

Код ниже дает реализацию предполагается, что ваш вклад является вектором Интс. Но вы можете изменить int на любой тип, который имеет <.

unsigned long long unique_pairs(const std::vector<int>& elements){ 
    std::map<int, int> counts; 
    for (int i = 0; i < elements.size(); ++i){ 
     ++counts[elements[i]]; 
    } 
    unsigned long long n = counts.size(); // # of different elements 
    unsigned long long m(0);    // # of repeated elements 
    for (std::map<int, int>::iterator it = counts.begin(); it != counts.end(); ++it){ 
     if (it->second != 1){ 
      ++m; 
     } 
    } 
    return n * (n - 1)/2 + m; // n C 2 + m 
} 

Demo