'Sup大家,我試圖解決一個非常奇怪的問題。我將舉一個例子來解釋我想要實作的目標。
我有一個 uint 陣列。給定一個數字“n”,我如何找到唯一的解決方案,讓我把數字加起來達到“n”?我說的是“唯一的解決方案”,因為只有一個解決方案才能達到這個數字。
// This is not my array, but it's pretty similar.
// Given number: 96
// Used numbers to reach it: 32, 64
uint[] values = new uint[]
{
1,
2,
4,
8,
16,
32,
64,
128,
256,
512,
1024,
2048,
};
uj5u.com熱心網友回復:
你的問題是一個相當簡單的數學方程,因為你所有的數字都是 2 的冪,你最好去一個數學網站來探索這些選項
但是,這是任何數字串列的強力組合通用方法
給定的
單位和擴展
public static uint Sum(this IEnumerable<uint> source)
{
uint sum = 0;
checked
{
return source.Aggregate(sum, (current, v) => current v);
}
}
獲得組合的方法
public static IEnumerable<T[]> GetCombinations<T>(T[] source)
{
for (var i = 0; i < (1 << source.Length); i )
yield return source
.Where((t, j) => (i & (1 << j)) != 0)
.ToArray();
}
一種過濾目標的方法
public static IEnumerable<uint[]> GetTargets(IEnumerable<uint> source, uint target)
=> GetCombinations(source.ToArray())
.Where(items => items.Sum() == target);
用法
uint[] values = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, };
foreach (var found in GetTargets(values,96))
Console.WriteLine(string.Join(", ", found));
輸出
32, 64
完整演示在這里
請注意,如果您將它與任何大小任意的串列一起使用,請等待許多次生命周期的答案
uj5u.com熱心網友回復:
Ifvalues是一個數字的所有冪的串列(在您的示例中,是 2 的冪)。然后,您可以從后到前遍歷冪串列,以找到高于您正在破壞零件的數字的值,然后從數字中減去它們(貪婪的方法):
private static IEnumerable<uint> FindParts(uint number, uint []powers)
{
for (var i = powers.Length - 1; i >= 0; i--)
{
if (number >= powers[i])
{
yield return powers[i];
number -= powers[i];
}
}
}
并像使用它一樣
uint randomNumber = (uint)new Random().Next(4095);
var parts = FindParts(randomNumber, values);
Console.WriteLine($"{randomNumber}={string.Join(' ', parts)}");
看直播
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/340902.html
上一篇:在串列的串列中查找值?
