為了更好地理解,我舉一個簡單的例子:我們有 10 盞燈。我們可以點亮一兩個。有必要寫下點亮兩盞燈的所有方法。這個例子很簡單。我們可以像這樣列出所有選項:
List<string> lstAllOptions = new List<string> ( );
for ( int i = 1; i <= 10; i )
{
lstAllOptions.Add ( i.ToString ( ) );
}
for ( int i = 1; i <= 10; i )
{
for ( int j = 1; j <= 10; j )
{
if ( i != j && j>i )
{
lstAllOptions.Add ( i.ToString ( ) " and " j.ToString ( ) );
}
}
}
但是如果用戶設定了燈的數量呢?我們可以擁有 43 盞燈,并且能夠打開其中的 19 盞。或者隨你喜歡。我可以增加For的數量,但是很難。如何更輕松地解決這個問題并為任意數量的燈制定通用方法?
uj5u.com熱心網友回復:
以下是計算這種組合的方法:
public static IEnumerable<IEnumerable<int>> AllCombinations(int n, int k) =>
from i in Enumerable.Range(0, 1 << n)
let r = Enumerable.Range(0, n).Select(j => ((i & 1 << j) == 0 ? 1 : 0))
where r.Count(s => s == 1) <= k
select r;
然而,n == 43它吹拍了一個整數可以容納的東西。
它確實適用于較低的值:
Console.WriteLine(AllCombinations(24, 19).Count());
給出:
16764265
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/367308.html
上一篇:數值計算總和的正確方法
