【问题标题】:How to make all possible sum combinations from array elements in VB如何在VB中对数组元素进行所有可能的求和组合
【发布时间】:2011-01-31 08:28:51
【问题描述】:

如果有一个数组的元素:1,2,3,4,程序应该返回另一个数组,其中包含所有组合的总和:

1
2
3
4
3 (1+2)
4 (1+3)
5 (1+4)
5 (2+3)
6 (2+4)
7 (3+4)
6 (1+2+3)
7 (1+2+4)
8 (1+3+4)
9 (2+3+4)
10(1+2+3+4)

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 看起来就像另一个作业
  • 这是我期末论文的一小部分,我需要它来形成容量输出概率表,我将不胜感激
  • 我有一个想法,我尝试用 n 位组成一个 2^n 数字,并将每个数字与每个元素相乘 111 X 123 110 X 123 101 X 123 100 X 123 010 X 123 011 X 123 001 X 123 000 X 123 但是当我需要更多数字时我遇到了麻烦

标签: vb.net arrays elements combinatorics


【解决方案1】:

这是我前段时间编写的一个函数,用于生成给定数组的所有可能子集。它是通用的,因此它支持整数、双精度、字符串等。

原始 C#

public static List<T[]> CreateSubsets<T>(T[] originalArray)
{
    List<T[]> subsets = new List<T[]>();

    for (int i = 0; i < originalArray.Length; i++)
    {
        int subsetCount = subsets.Count;
        subsets.Add(new T[] { originalArray[i] });

        for (int j = 0; j < subsetCount; j++)
        {
            T[] newSubset = new T[subsets[j].Length + 1];
            subsets[j].CopyTo(newSubset, 0);
            newSubset[newSubset.Length - 1] = originalArray[i];
            subsets.Add(newSubset);
        }
    }

    return subsets;
}

还有我刚刚转成VB的版本。

Function CreateSubsets(Of T)(ByVal originalArray() As T) As List(Of T())

    Dim subsets As New List(Of T())

    For i As Integer = 0 To originalArray.Length - 1

        Dim subsetCount As Integer = subsets.Count
        subsets.Add(New T() {originalArray(i)})

        For j As Integer = 0 To subsetCount - 1
            Dim newSubset(subsets(j).Length) As T
            subsets(j).CopyTo(newSubset, 0)
            newSubset(newSubset.Length - 1) = originalArray(i)
            subsets.Add(newSubset)
        Next

    Next

    Return subsets

End Function

可以这样食用

    Dim array() As Integer = {1, 2, 3, 4, 5}
    Dim subsets As List(Of Integer()) = CreateSubsets(array)

    For Each subset As Integer() In subsets

        Dim sum As Integer = subset.Sum()

    Next

【讨论】:

    【解决方案2】:

    用伪 VB 代码编写您在评论中提到的算法:

    ReDim result(2 ^ (Length of Array) - 1)
    for index = 0 to 2 ^ (Length of Array) - 1
      sum = 0
      for counter = 0 to (Length of Array) - 1
        If ((2 ^ counter) And index) <> 0 Then
          sum += Array(counter+1)
    
      result(index) = sum
    

    【讨论】:

    • 我认为索引应该从 1 开始。
    • 是的,索引应该从 1 开始以错过空组合,而且我的伪 VB 代码也存在数组索引和浪费条目的问题。
    【解决方案3】:

    我的想法是:

    (伪代码,我不懂VB)

    for(int i = 0; i < 4321; i++)
    {
        i mod 10 + // first from right digit
        (int)((i mod 100)mod 10) // second, (?)
        // etc
        // sum up all 4 digit
        // add to array  
    }
    

    【讨论】:

    • 问题是我需要为 n 编写代码,而不仅仅是 4 个数字
    • 总是你可以对你的数字进行排序,然后用最大的数字代替 4321 :) 无论如何,这是另一个问题,因为 1000100 应该只出现一次?
    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多