我意識到有關於combinatorics和枚舉的問題,但我已經搜索了周圍,並沒有找到任何與我之後特別有關的任何東西。如果我錯過了某些東西,請將它指向我,然後問題就可以結束。因此,假設我們有一組N個元素,並且我們有x個正整數k1,...,kx其中Sum(k1,...,kx)< = N。我想枚舉所有方法我可以選擇(無需替換)給定尺寸的x個子集,從原始集合N.如何枚舉組合的組合從一個集合
我希望我的措辭正確。如果我沒有,一個簡單的例子。
N = 4,X = 2,K 1 = 2,K 2 = 1
我們應該列舉
- {1,2} {3}
- {1,2} {4}
- {1,3} {2}
- {1,3} {4}
- {1,4} {2}
- {1,4} {3}
- {2, 3} {1}
- {2,3} {4}
- {2,4} {1}
- {2,4} {3}
- {3,4} {1}
- {3, 4} {2}
在一般情況下,總的計數將我想爲:
C(N,K i)* C(N - K1,K2)* ... * C( N - Sum(k1,...,kn-1),kn)。
我最初的猜測是,這可以使用堆棧相當容易地完成。在每個堆棧級別i,將使用標準組合枚舉生成子集ki,或者從每個級別的源集合中移除那些已選擇的元素,或者僅從原始集合中枚舉並跳過之前包含元素的情況。
我的問題是,有更快/更優雅的解決方案嗎?
SOs格式檢查器是荒謬的,我剛剛花了45分鐘與它爭取讓它接受我的問題,因爲它告訴我我的代碼格式不正確。沒有代碼,我最初的預覽格式很好。我非常接近放棄。 – kamrann
我認爲你應該用一個遞歸函數來構建第一個子集,然後第二個... – alestanis