[英]Algorithm to find number of combinations
假設我有四個數字0,1,1,3
。 我想找到兩個數字唯一組合的數字。 請幫助我編寫此算法和代碼。 我知道這更多是一個數學問題,但仍然必須編寫代碼。 請幫我。
根據您的示例集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
}
您必須在其中使用組合公式。 您應該為此編寫一個階乘函數。
例如,假設您有4個數字,並且想要組合的數量不重復,那么使用4C2
這里2是要組合使用的元素數
4是您擁有的元素總數
因此您可以使用4解決此問題! /(2!*(4-2)!) ....因此此計算將為您提供組合總數,而無需重復
注意:對於獨特的組合,您應該具有獨特的元素
一個簡單的偽代碼對您來說是這樣的:
1- getInputs(std::vector<int> inputs)
//負責從用戶讀取輸入
2- removeDuplicates(std:vector<int> inputs)
//從輸入中刪除重復項
3- calculateCombination(n = length(inputs))
//如果您正在尋找組合,則應實現n!/((n-2)!*2!)
或者如果您正在尋找置換,則應實現n!/(n-2)!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.