Vba 动态规划实例与问题

Vba 动态规划实例与问题,vba,dynamic-programming,memoization,Vba,Dynamic Programming,Memoization,我正在尝试使用VBA运行一个动态编程示例,通过在字典中存储值来限制递归调用函数的次数 我遇到的问题是,在使用生成的键将值存储在字典中之前,递归调用函数。通常,我会在dictionary键存储相关值后使用'return'关键字,但在VBA中似乎不起作用 Public Function count_sets_dp(arr, total) Dim mem As Dictionary Set mem = New Dictionary count_sets_dp = dp(arr, total, GetA

我正在尝试使用VBA运行一个动态编程示例,通过在字典中存储值来限制递归调用函数的次数

我遇到的问题是,在使用生成的键将值存储在字典中之前,递归调用函数。通常,我会在dictionary键存储相关值后使用'return'关键字,但在VBA中似乎不起作用

Public Function count_sets_dp(arr, total)
Dim mem As Dictionary
Set mem = New Dictionary
count_sets_dp = dp(arr, total, GetArrLength(arr), mem)
最后一个'else'子句启动递归调用,而不将结果存储在mem(key)中


不清楚代码的具体用途是什么?您可以a)在第一个
If
块中添加“Exit Function”,或b)删除
End If
并用
ElseIf
替换下一个
If
,以利用记忆解决方案。另外,
ElseIf total
没有任何分配给
dp
,因此代码将产生不正确的结果@TimWilliams这是一种用给定的和来实现集合子集计数的尝试。@BrakNicku我想我可能误解了记忆解决方案的好处。我的期望是,我可以在数组中包含更多的4,并且不会将处理时间增加太多b/c结果已经存储在字典中。当我实现时,与不使用记忆的递归解决方案相比,在得到溢出错误之前,我只能向数组中再添加两个4。这是典型的吗?您必须将
Integer
更改为
Long
,以消除整数溢出,但一旦您像我上面所说的那样更改代码,它应该会运行良好。谢谢。至于您对“未分配给dp”的评论,是否不可能临时分配给占位符变量(to_return),并在执行其他所需操作后返回?
Public Function dp(arr, total, i, mem)
'dynamic programming or memoized solution

Dim Key As String
Dim to_return As Integer

Key = CStr(total) & ":" & CStr(i)
If mem.Exists(Key) Then
      dp = mem(Key)
End If
If total = 0 Then
dp = 1


ElseIf total < 0 Then
dp = 0


ElseIf i < 1 Then
dp = 0


ElseIf total < arr(i) Then
to_return = dp(arr, total, i - 1, mem)

Else: to_return = (dp(arr, total - arr(i), i - 1, mem) + dp(arr, total, i - 1, mem))
mem(Key) = to_return
dp = to_return
End If

End Function
Sub mysub()

Dim timetaken As Double
Dim myArray() As Variant
Dim result As Integer

myArray = [{2,4,6,4,10,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}]

result = count_sets_dp(myArray, 16)

MsgBox (result)

End Sub```