我有很多LInked Lists,其中链表的数量在理论上是随机的,因为我可以有一个未指定的数量。每个列表中的元素数量也可以是任何数量。基本上,我可以有一个随机数量的列表,随机数量如下:
列表1
列表2
列表3
列表4
等等......
我想做的是检查每个列表中添加的元素的任何组合是否等于某个值。
例如List 1
中的元素1 + List 2
中的元素5 + List 3
中的元素2 + List 4
中的元素1 =某个值。我想要的是跟随前一个列表的所有列表组合,即它必须是列表1 +列表2 + ....列表n,按顺序。
有人可以建议如何实现这一目标吗?
答案 0 :(得分:0)
如果你说的是:从每个列表中取一个int并查看它们的总和是否等于那么
List<List<int>> lists = new List<List<int>>();
lists.Add(new List<int>() { 1, 34, 91});
lists.Add(new List<int>() { 6, 5, 94, 43, 245, 467 });
lists.Add(new List<int>() { 98, 39 });
lists.Add(new List<int>() { 11 });
var cp = CartesianProduct(lists);
int searchFor = 115;
foreach (var list in cp)
{
if (list.Sum() == searchFor)
{
foreach (var i in list) Console.Write(i + " ");
}
}
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new IEnumerable<T>[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
{
return accumulator.SelectMany(
(accseq => sequence),
(accseq, item) => accseq.Concat(new T[] { item })
);
}
);
}
答案 1 :(得分:0)
试试这个:
const int SearchedValue = 296;
static List<LinkedList<int>> lists;
static Stack<int> indexes = new Stack<int>();
private static void Check(int sum, int listIndex)
{
if (listIndex == lists.Count)
{
if (sum == SearchedValue)
{
Console.WriteLine("Found: " + String.Join(", ",
indexes.Reverse().Select(i => i + 1).ToArray()));
}
}
else
{
int i = 0;
foreach (var value in lists[listIndex])
{
indexes.Push(i++);
Check(sum + value, listIndex + 1);
indexes.Pop();
}
}
}
public static void Main()
{
var list1 = new LinkedList<int>();
list1.AddLast(1);
list1.AddLast(34);
list1.AddLast(91);
var list2 = new LinkedList<int>();
list2.AddLast(6);
list2.AddLast(5);
list2.AddLast(94);
list2.AddLast(43);
list2.AddLast(245);
list2.AddLast(467);
var list3 = new LinkedList<int>();
list3.AddLast(98);
list3.AddLast(39);
var list4 = new LinkedList<int>();
list4.AddLast(11);
lists = new List<LinkedList<int>>() { list1, list2, list3, list4 };
Check(0, 0);
}