如何对包含随机元素量的随机数量的列表进行操作

时间:2012-03-18 17:39:07

标签: c# .net list data-structures linked-list

我有很多LInked Lists,其中链表的数量在理论上是随机的,因为我可以有一个未指定的数量。每个列表中的元素数量也可以是任何数量。基本上,我可以有一个随机数量的列表,随机数量如下:

列表1

  • 1
  • 34
  • 91

列表2

  • 6
  • 5
  • 94
  • 43
  • 245
  • 467

列表3

  • 98
  • 39

列表4

  • 11

等等......

我想做的是检查每个列表中添加的元素的任何组合是否等于某个值。

例如List 1中的元素1 + List 2中的元素5 + List 3中的元素2 + List 4中的元素1 =某个值。我想要的是跟随前一个列表的所有列表组合,即它必须是列表1 +列表2 + ....列表n,按顺序。

有人可以建议如何实现这一目标吗?

2 个答案:

答案 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);
}