簡體   English   中英

查找組合數量的算法

[英]Algorithm to find number of combinations

假設我有四個數字0,1,1,3 我想找到兩個數字唯一組合的數字。 請幫助我編寫此算法和代碼。 我知道這更多是一個數學問題,但仍然必須編寫代碼。 請幫我。

根據您的示例集0,1,1,3 ,我假設您想在輸入中允許重復項,這使得查找唯一組合的數量變得更加困難。

由於您只想選擇唯一的對,所以這比選擇唯一的n組要簡單得多(至少在允許重復的情況下)。

這個想法是先刪除所有重復項,同時保持多少輸入具有重復值。

您的回答將是

n C 2 + m其中n是不同元素的數量, m是重復的元素數量。

對於0,1,1,3n = 3m = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM