将所有可能的总和从值列表添加到列表中的相同值列表

时间:2015-04-06 22:59:25

标签: c#

我有一个包含值10,20,30,50,30

的列表

我想添加列表中存在的所有可能的值:

10+20 = 30
10+30 = 40
10+50 = 60
20+30 = 50

10+20+30+50+30

我声明的列表是这样的:

列表列表=新列表();

使用for循环添加

和值(即10,20,30,50,30)。

到目前为止:

List<int> list = new List<int>();
list.Add(3);
list.Add(7);
list.Add(8);
list.Add(1);

var length = list.Count();

for (int i = 0; i < length; i++)
{
   var sum = 0;
   sum = sum + list[i];

   for (int j = i + 1; j < length; j++)
   {
       sum = sum + list[j];
       list.Add(list[i] + list[j]);
   }
   list.Add(sum);
}

2 个答案:

答案 0 :(得分:0)

如果您只想要2个元素,通常会使用两个for循环来完成。但是,如果您想从1到所有元素中选择所有组合,那么您正在寻找power set

我会回答它只是选择2

List<int> sums = new List<int>();
for(int first = list.Length - 1; first >= 1; first--)
{
    for(int second = first - 1; second >= 0; second--)
    {
        sums.Add(list[first] + list[second]);
    }
}

您还应该将其括起来以确保您的列表中至少包含2个项目...

修改 由于您已更新了问题以显示您的实施,因此我将包含用于生成电源设置的代码

public IEnumerable<IEnumerable<int>> PowerSet(IEnumerable<int> initialSet)
{
    foreach (IEnumerable<int> set in PowerSetRecursive(initialSet, initialSet.Count() - 1))
    {
        yield return set;
    }
}

private IEnumerable<IEnumerable<int>> PowerSetRecursive(IEnumerable<int> initialSet, int index)
{
    if (index == 0)
    {
        yield return new int[] { };
        yield return new int[] { initialSet.ElementAt(index) };
    }
    else
    {
        foreach (IEnumerable<int> set in PowerSetRecursive(initialSet, index - 1))
        {
            yield return new HashSet<int>(set);
            yield return new HashSet<int>(set) { initialSet.ElementAt(index) };
        }
    }
}

然后你会像这样循环

foreach (IEnumerable<int> set in PowerSet(new int[] { 1, 2, 3, 4 }))
{
    Console.WriteLine(set.Sum());
}

答案 1 :(得分:0)

这对我有用:

Func<IEnumerable<int>, IEnumerable<int>> getAllSelectionSums = null;
getAllSelectionSums = xs =>
{
    if (!xs.Any())
    {
        return new [] { 0 };
    }
    else
    {
        return
            from h in xs.Take(1).Concat(new [] { 0 })
            from t in getAllSelectionSums(xs.Skip(1))
            select h + t;
    }
};

因此,给定var source = new [] { 3, 7, 8, 1 };作为输入,我得到以下结果:

result