Tuve que diseñar un método para llenar varios conjuntos de estantes que tenían una cierta altura fija con unidades individuales llamadas MCC. Cada unidad que iba dentro del bastidor era de un tamaño diferente, por lo que el objetivo era utilizar la menor cantidad posible de bastidores y llenar los bastidores de manera óptima dada la altura de cada unidad; se utilizó una función recursiva para calcular la forma óptima de llenar los bastidores utilizando tan pocos bastidores como posible. Este es un método para calcular un «problema de suma de subconjuntos». Adjuntaré todo el proyecto que dibuja las unidades, sin embargo, la función principal es lo que me interesaba; a continuación, se encuentra la función recursiva y su método para llamar.

Public fR como función booleana RealEqual (A, B, Epsilon opcional como doble = 0,00000001)

RealEqual = Abs (A – B) ⇐ Función de fin de Epsilon Función ExtendRslt (CurrRslt, NewVal, Separator)

Si CurrRslt = «» Entonces ExtendRslt = NewVal _ Else ExtendRslt = CurrRslt & Separator & NewVal End Function Sub recursiveMatch (ByVal MaxSoln como Integer, ByVal TargetVal, InArr (), _ ByVal HaveRandomNegatives como booleano, _dx ByVal CurrI , ByVal Epsilon como doble, _ ByRef Rslt (), ByVal CurrRslt como cadena, ByVal Separator como cadena)

Dim I como entero para I = CurrIdx a UBound (InArr, 2)

Si RealEqual (CurrTotal + InArr (2, I), TargetVal, Epsilon) Entonces 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 Entonces Salir de Sub Si fR = True Entonces Salir de 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) Then recursiveMatch MaxSoln, TargetVal, InArr (), HaveRandomNegatives +, Curr _ I InArr (2, I), Epsilon, Rslt (), _ ExtendRslt (CurrRslt, I, Separator), _ Separator If MaxSoln <> 0 Then If fR = True Then Exit Sub Else ‘no coincide End If Next I End Sub Llamado por recursiveMatch MaxSoln, TargetVal, InArr, HaveRandomNegatives, _ LBound (InArr), 0, 0.00000001, _ Rslt, «», «,»