我必须设计一种方法,用称为MCC的单个单元填充具有一定固定高度的多组机架。放入机架中的每个单元的大小均不同,因此目标是使用尽可能少的机架,并根据每个单元的高度最佳地填充机架-使用递归函数来计算填充机架的最佳方式,同时使用的机架数尽可能少。可能。这是一种计算“子集和问题”的方法。我将附上整个绘制单元的项目,但是主要功能是我感兴趣的-遵循的是递归函数及其调用方法。

作为布尔函数RealEqual(A,B,可选Epsilon为Double = 0.00000001)的公共fR

RealEqual = Abs(A-B)⇐ Epsilon结束函数函数ExtendRslt(CurrRslt,NewVal,分隔符)

如果CurrRslt =“”,则ExtendRslt = NewVal 其他ExtendRslt = CurrRslt&分隔符&NewVal结束函数子递归匹配(ByVal MaxSoln为整数,ByVal TargetVal,InArr(), ByVal HaveRandomNegatives为布尔值,_ ByVal CurrIdx为In_ ,ByVal Epsilon作为Double,_ ByRef Rslt(),ByVal CurrRslt作为字符串,ByVal分隔符作为字符串)

昏暗的我作为整数为我= CurrIdx到UBound(InArr,2)

如果RealEqual(CurrTotal + InArr(2,I),TargetVal,Epsilon),则Rslt(UBound(Rslt))=(CurrTotal + InArr(2,I))_&Separator&ExtendRslt(CurrRslt,I,Separator)

fR = True,如果MaxSoln = 0,则如果UBound(Rslt)Mod 100 = 0,则Debug.Print“ Rslt(”&UBound(Rslt)&“)=”&Rslt(UBound(Rslt))

否则,如果UBound(Rslt)> = MaxSoln,则退出子如果fR = True,则退出子端如果ReDim保留Rslt(UBound(Rslt)+ 1)

ElseIf IIf(HaveRandomNegatives,False,CurrTotal + InArr(2,I)> TargetVal + Epsilon)然后ElseIf CurrIdx <UBound(InArr,2)然后递归匹配MaxSoln,TargetVal,InArr(),HaveRandomNegatives,_ I + 1,_ CurrTo InArr(2,I),Epsilon,Rslt(),_ ExtendRslt(CurrRslt,I,Separator),_ Separator如果MaxSoln <> 0则如果fR = True然后Exit Sub Else’不匹配End如果下一个I End Sub调用recursiveMatch MaxSoln,TargetVal,InArr,HaveRandomNegatives,_ LBound(InArr),0、0.00000001,_ Rslt,“”,“,”