2010-03-24 87 views
1

如果存在与元素的数组:1,2,3,4,程序应该返回另一个阵列的所有组合的总和:如何使从数组元素的所有可能的总和组合在VB

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)
+3

那你试试这么远吗? – medopal 2010-03-24 16:30:55

+0

只是看起来像另一个作业 – Regent 2010-03-24 16:32:25

+1

这是我的最后一篇论文的一小部分,我需要那个形成容量输出概率表,我将不胜感激帮助 – Elma 2010-03-24 16:39:14

回答

0

我的想法是:

(pseudcode,我不;知道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 
} 
+0

问题是,我需要为n代码,而不仅仅是4个数字 – Elma 2010-03-25 09:57:16

+0

总是你可以分类我的数字,使大而不是4321: 无论如何,这是另一个问题,因为'1000'和'100'应该只出现一次? – IProblemFactory 2010-03-25 18:37:21

0

编码您在您的评论中提到的算法,在伪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 
+0

我认为索引应该从1开始。 – Gabe 2010-03-30 04:37:27

+0

是的,索引应该从1开始错过空白组合,并且我的伪VB代码也存在数组索引和浪费条目的问题。 – 2010-03-30 23:55:21

4

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

原来的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 
+0

+1的片段 - 很好,干净和短。安东尼! – Mike 2010-05-21 20:18:09

+0

它可以用尽内存快.... – cyrianox 2014-02-24 16:37:21

相关问题