Sottoinsieme Somma Problema
Ho dovuto progettare un metodo per riempire più set di rack di una certa altezza fissa con singole unità chiamate MCC. Ogni unità che entrava nel rack era di dimensioni diverse, quindi l’obiettivo era quello di utilizzare il minor numero di rack possibile e riempire i rack in modo ottimale data l’altezza di ciascuna unità: è stata utilizzata una funzione ricorsiva per calcolare il modo ottimale di riempire i rack utilizzando il minor numero di rack possibile. Questo è un metodo per calcolare un “problema di somma di sottoinsiemi”. Allegherò l’intero progetto che disegna le unità, tuttavia la funzione principale è ciò a cui ero interessato – a seguire è la funzione ricorsiva e il suo metodo da chiamare.
Public fR As Boolean Function RealEqual (A, B, Epsilon As Double opzionale = 0.00000001)
RealEqual = Abs (A – B) ⇐ Epsilon End Function Funzione ExtendRslt (CurrRslt, NewVal, Separator)
If CurrRslt = “” Then ExtendRslt = NewVal _ Else ExtendRslt = CurrRslt & Separator & NewVal End Function Sub recursiveMatch (ByVal MaxSoln As Integer, ByVal TargetVal, InArr (), _ ByVal HaveRandomNegatives As Boolean, _ AsValger CurrId , ByVal Epsilon As Double, _ ByRef Rslt (), ByVal CurrRslt As String, ByVal Separator As String)
Dim I As Integer For I = CurrIdx To UBound (InArr, 2)
If RealEqual (CurrTotal + InArr (2, I), TargetVal, Epsilon) Then Rslt (UBound (Rslt)) = (CurrTotal + InArr (2, I)) _ & Separator & ExtendRslt (CurrRslt, I, Separator)
fR = True If MaxSoln = 0 Then If UBound (Rslt) Mod 100 = 0 Then Debug.Print “Rslt (” & UBound (Rslt) & “) =” & Rslt (UBound (Rslt))
Else ‘If UBound (Rslt)> = MaxSoln Then Exit Sub If fR = True Then Exit Sub End If ReDim Preserve Rslt (UBound (Rslt) + 1)
ElseIf IIf (HaveRandomNegatives, False, CurrTotal + InArr (2, I)> TargetVal + Epsilon) Then ElseIf CurrIdx <UBound (InArr, 2) Quindi ricorsivoMatch MaxSoln, TargetVal, InArr (), HaveRandomNegatives, _ I + 1, _ CurrTotal InArr (2, I), Epsilon, Rslt (), _ ExtendRslt (CurrRslt, I, Separator), _ Separator If MaxSoln <> 0 Then If fR = True Then Exit Sub Else ‘no match End If Next I End Sub Chiamato da recursiveMatch MaxSoln, TargetVal, InArr, HaveRandomNegatives, _ LBound (InArr), 0, 0.00000001, _ Rslt, “”, “,”