簡體   English   中英

使用多個求和找到有序集合的組合數

[英]Find number of combinations of ordered set using multiple summations

這是關於尋找其中元素具有約束的有序集合的多個組合的問題。

舉個例子:

a + b + c + d + e = 635,可能是...

[0-90] + [1-120] + [50-150] + [20-200] + [30-250] = 635

一種解決方案使用多次求和,正如在數學堆棧交換中所回答的那樣。

https://math.stackexchange.com/questions/159197/combinatorics-using-constraints-and-ordered-set

有人可以對解決此類問題的過程或偽代碼給出一個總體思路嗎?

非常感謝你!

查看數學交換頁面上發布的解決方案。 每個sigma符號都是嵌套的for循環。 最里面的項x作為if給出。 因此,您的算法應該是圍繞if的四個嵌套循環。

一堆嵌套的for循環是最簡單的方法。

偽代碼:

let combinations = 0;
for a = 0 to 90
    for b = max(a+1, 1) to 120
        for c = max(b+1, 50) to 150
            for d = max(c+1, 20) to 200
                let e = 635 - a - b - c - d;
                if max(d+1, 50) <= e <= 250
                    let combinations = combinations + 1

更新資料

可以對上面的內容進行一些優化,但最終會得到特定的解決方案,而不是一般的解決方案。

您可以觀察到(a+1) >= 1始終為true,因此我們可以擺脫對b的賦值中的max調用。 同樣, (c+1) >= 20始終為true,因此可以簡化對d的分配。

您還可以看到a + b + c + d的最大可能值為540,這為e給出了最小可能值為95。 這大於e的規定下限,因此我們只需要檢查e >= (d+1)

我們最終得到:

let combinations = 0;
for a = 0 to 90
    for b = a+1 to 120
        for c = max(b+1, 50) to 150
            for d = c+1 to 200
                let e = 635 - a - b - c - d;
                if d+1 <= e <= 250
                    let combinations = combinations + 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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