Vba 其和最大但小于特定值的子集

Vba 其和最大但小于特定值的子集,vba,algorithm,excel,knapsack-problem,sub-array,Vba,Algorithm,Excel,Knapsack Problem,Sub Array,我有一个正值数组。 例如,数组={5,4,4,3.8,2,1.7} 我需要找到一个子数组,它的和最大但小于12。 在这种情况下,它将是{4,4,3.8} 另一个ex数组{7,4,3,2} 在这种情况下,最大和是12,子集是{7,3,2} 它的算法是什么,因为我有一个非常大的数组,它的长度超过1000。 我正在用VBA excel编写这个程序 谢谢。尝试此算法以获得子序列 Sub aargh() Dim a As Variant Dim limsum As Double, highestnum A

我有一个正值数组。 例如,数组={5,4,4,3.8,2,1.7} 我需要找到一个子数组,它的和最大但小于12。 在这种情况下,它将是{4,4,3.8}

另一个ex数组{7,4,3,2} 在这种情况下,最大和是12,子集是{7,3,2}

它的算法是什么,因为我有一个非常大的数组,它的长度超过1000。 我正在用VBA excel编写这个程序


谢谢。

尝试此算法以获得子序列

Sub aargh()
Dim a As Variant
Dim limsum As Double, highestnum As Double
Dim i As Integer, j As Integer
    a = Array(5, 4, 4, 3.8, 2, 1.7)
    limsum = 12

    highestsum = 0
    For i = 0 To UBound(a)
        s = a(i)
        j = i
        Do
            If s > highestsum Then fs = i: ls = j: highestsum = s
            j = j + 1
            If j > UBound(a) Then Exit Do
            s = s + a(j)
        Loop While s <= limsum
    Next i
    MsgBox "subarray (" & fs & "," & ls & ") sum = " & highestsum
End Sub
Sub-aargh()
变暗作为变体
双份柠檬点心,最高份双份
尺寸i为整数,j为整数
a=数组(5,4,4,3.8,2,1.7)
limsum=12
最高总和=0
对于i=0到UBound(a)
s=a(i)
j=i
做
如果s>highestsum,则fs=i:ls=j:highestsum=s
j=j+1
如果j>UBound(a),则退出Do
s=s+a(j)

循环,而s尝试此算法以获得子序列

Sub aargh()
Dim a As Variant
Dim limsum As Double, highestnum As Double
Dim i As Integer, j As Integer
    a = Array(5, 4, 4, 3.8, 2, 1.7)
    limsum = 12

    highestsum = 0
    For i = 0 To UBound(a)
        s = a(i)
        j = i
        Do
            If s > highestsum Then fs = i: ls = j: highestsum = s
            j = j + 1
            If j > UBound(a) Then Exit Do
            s = s + a(j)
        Loop While s <= limsum
    Next i
    MsgBox "subarray (" & fs & "," & ls & ") sum = " & highestsum
End Sub
Sub-aargh()
变暗作为变体
双份柠檬点心,最高份双份
尺寸i为整数,j为整数
a=数组(5,4,4,3.8,2,1.7)
limsum=12
最高总和=0
对于i=0到UBound(a)
s=a(i)
j=i
做
如果s>highestsum,则fs=i:ls=j:highestsum=s
j=j+1
如果j>UBound(a),则退出Do
s=s+a(j)

循环而s正如许多人在评论中提到的,这是一个简单的变化。为了解决这个确切的问题,您只需要记住小于或等于
12
的最大数量

简单的递归abroach如下所示:

list = [...]
N = length of list
dp[ maximum possible sum ][ N ]

f(‌current_sum, index):
  if dp[current_sum][index] is set
    return dp[current_sum][index]
  if index >= N
    if current_sum > 12
       result = 0
    else
       result = current_sum
  else
    result = max( f(current_sum, index+1), f(current_sum+list[index], index+1)
  dp[current_sum][index] = result
  return result

result = f(0,0) // this will return the desired result

正如许多人在评论中提到的,这是一个简单的变化。为了解决这个确切的问题,您只需要记住小于或等于
12
的最大数量

简单的递归abroach如下所示:

list = [...]
N = length of list
dp[ maximum possible sum ][ N ]

f(‌current_sum, index):
  if dp[current_sum][index] is set
    return dp[current_sum][index]
  if index >= N
    if current_sum > 12
       result = 0
    else
       result = current_sum
  else
    result = max( f(current_sum, index+1), f(current_sum+list[index], index+1)
  dp[current_sum][index] = result
  return result

result = f(0,0) // this will return the desired result

请展示您所做的尝试。
{5,4,4,3.8,2,1.7}
中没有反例,但“子数组”指的是集合(即任何一组数字)或序列。这是一个NP完全问题。请参阅和@Nelxiost,如果OP表示子集而不是子序列,则这与这些问题完全相同。如果他指的是子序列,那么蛮力二次解确实是可能的。这就是为什么共产国际问。@Comintem yes set(即任何组和任何长度的子数组)请显示您所做的尝试。
{5,4,4,3.8,2,1.7}
中没有反例,但“子数组”指的是集合(即任何一组数字)或序列。这是一个NP完全问题。请参阅和@Nelxiost,如果OP表示子集而不是子序列,则这与这些问题完全相同。如果他指的是子序列,那么蛮力二次解确实是可能的。这就是为什么Comintern会问这个问题。@Comintem yes set(即任何组和任何长度的子数组)您可能希望
将i=0绑定到(a)
。否则,您将不允许子序列从最后一个元素开始(和结束)。例如,如果您的设置是
a=Array(5,4,4,3.8,2,13.9)
limsum=14
,那么您希望返回子序列(5,5)w/sum 13.9,而不是子序列(1,4)w/sum 13.8。我已经检查了你的代码,但是它没有给出这个数组的正确结果(7,4,3,2)。最大和应该是12,子集(7,3,2),但是它的和=11@Abhishek您是否编辑了
limsum
的值?这是总和限制数。出于某种原因,h2so4将其设置为13而不是12。如果您将其修改为12,您会发现它对于您的示例很好。但是,它在子序列而不是子集上工作(因为问题的定义不是很好)。如果你真的想要子集,你最好研究背包问题的一些算法(如评论中所链接的)。实际上我想问的是子集数不必是连续的。它们可以是任意一组数字。@Abhishek有一些伪代码,并有大量的堆栈溢出问题和讨论。您可能希望i=0的
能够绑定(a)
。否则,您将不允许子序列从最后一个元素开始(和结束)。例如,如果您的设置是
a=Array(5,4,4,3.8,2,13.9)
limsum=14
,那么您希望返回子序列(5,5)w/sum 13.9,而不是子序列(1,4)w/sum 13.8。我已经检查了你的代码,但是它没有给出这个数组的正确结果(7,4,3,2)。最大和应该是12,子集(7,3,2),但是它的和=11@Abhishek您是否编辑了
limsum
的值?这是总和限制数。出于某种原因,h2so4将其设置为13而不是12。如果您将其修改为12,您会发现它对于您的示例很好。但是,它在子序列而不是子集上工作(因为问题的定义不是很好)。如果你真的想要子集,你最好研究背包问题的一些算法(如评论中所链接的)。实际上我想问的是子集数不必是连续的。他们可以是任何一组数字。@Abhishek有一些伪代码,有很多问题和讨论。