2010-03-24 18 views
1

S'il y a un tableau avec des éléments: 1,2,3,4, le programme doit retourner un autre tableau avec la somme de toutes les combinaisons:Comment faire toutes les combinaisons possibles de somme d'éléments du tableau dans 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

ce que vous avez essayé jusqu'à présent? – medopal

+0

ressemble à un autre devoir – Regent

+1

c'est une petite partie de mon papier final, j'ai besoin de cela pour former la table de probabilité de capacité, et je serais reconnaissant de l'aide – Elma

Répondre

0

mon idée est:

(pseudcode, je ne, sais pas 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

problème est que je dois faire du code pour n, pas seulement pour 4 chiffres – Elma

+0

toujours vous pourrait trier votre chiffre et faire grand numéro de geste au lieu de 4321 :) Quoi qu'il en soit, voici un autre problème parce que «1000» et «100» devraient apparaître qu'une seule fois? – IProblemFactory

0

l'algorithme de codage que vous avez mentionné dans votre commentaire, en pseudo code VB: 0

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

Je pense que l'index devrait commencer à 1. – Gabe

+0

Oui, l'index devrait commencer à 1 pour rater la combinaison vide, et mon code pseudo VB a aussi des problèmes avec les indices de tableau et les entrées gaspillées. –

4

Il s'agit d'une fonction que j'ai écrite il y a quelque temps pour générer tous les sous-ensembles possibles d'un tableau donné. Il est générique, il prend en charge les entiers, doubles, chaînes, etc.

originale 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; 
} 

Et la version que je viens converti à 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 

Il peut être consommé de cette manière

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 pour l'extrait - agréable et propre et court. Anthony Anthony! – Mike

+0

il peut manquer de mémoire rapide .... – cyrianox