多个背包的背包有关问题
求助:多个背包的背包问题
有一个数组,包含有N个降序排列的数,例如:100,99,98....1,0。 N的大小不确定
要求从第一个数(100)开始,将这些数排到列表中,并要求该列表数字之和不超过200,若超过200,则将该数放入下一张列表并检验该表是否超过200,若超过则将该数放入在下一张列表检验。 每个数都要从第一张列表开始检验,看看是否满足,若不满足则放入第二张表检验,若在不满足则放入第三张...
例如:100,99, 气候的98~2都放入其他表,最后的1和0可以放入第一张表,因为100+99+1+0不超过200
同样,其他表也需要进行这种检验。 类似于多个背包的背包问题。
求思路及代码~~~
------解决方案--------------------
这个很好弄啊!
我先用TextBox 当背包吧!
在Form1窗体里面放入一个TextBox控件,然后复制这个TextBox控件 再粘贴到窗体中 提示"已经有一个控件Text 是否创建数组?" 点击'是'
下面是代码 已经测试通过!
------解决方案--------------------
有一个数组,包含有N个降序排列的数,例如:100,99,98....1,0。 N的大小不确定
要求从第一个数(100)开始,将这些数排到列表中,并要求该列表数字之和不超过200,若超过200,则将该数放入下一张列表并检验该表是否超过200,若超过则将该数放入在下一张列表检验。 每个数都要从第一张列表开始检验,看看是否满足,若不满足则放入第二张表检验,若在不满足则放入第三张...
例如:100,99, 气候的98~2都放入其他表,最后的1和0可以放入第一张表,因为100+99+1+0不超过200
同样,其他表也需要进行这种检验。 类似于多个背包的背包问题。
求思路及代码~~~
------解决方案--------------------
这个很好弄啊!
我先用TextBox 当背包吧!
在Form1窗体里面放入一个TextBox控件,然后复制这个TextBox控件 再粘贴到窗体中 提示"已经有一个控件Text 是否创建数组?" 点击'是'
下面是代码 已经测试通过!
Private Sub Form_Load()
'----------------
'这里声明你的数组名字为tmpL 为了演示简单 他的长度我设置成11个
Dim tmpNum As Long
Dim tmpL(10) As Long
tmpNum = 200 '设置总和不超过200
tmpL(10) = 199 '最大的数不能超过总和
tmpL(9) = 177
tmpL(8) = 163
tmpL(7) = 159
tmpL(6) = 155
tmpL(5) = 151
tmpL(4) = 101
tmpL(3) = 77
tmpL(2) = 55
tmpL(1) = 28
tmpL(0) = 1
'-----------------
Dim i As Integer, q As Integer
Dim tmpB() As Long
ReDim tmpB(UBound(tmpL)) As Long
Dim tmpQ As Integer, tmpT As Integer
Text1(0).Text = ""
Text1(1).Text = ""
tmpT = 1
For i = UBound(tmpL) To 0 Step -1
For tmpQ = 0 To UBound(tmpL)
If tmpL(i) + tmpB(tmpQ) <= tmpNum Then
tmpB(tmpQ) = tmpB(tmpQ) + tmpL(i)
If tmpQ > tmpT Then
tmpT = tmpT + 1
Load Text1(tmpT)
Text1(tmpT).Text = tmpL(i)
Exit For
Else
Text1(tmpQ).Text = Text1(tmpQ).Text & "," & tmpL(i)
Exit For
End If
End If
Next
Next
For i = 0 To tmpT
With Text1(i)
.Visible = True
.Top = i * 300
.Left = 10
.Height = 200
.Width = 6000
End With
Next
For i = 0 To 1
Text1(i) = Mid(Text1(i), 2, Len(Text1(i)) - 1)
Next
End Sub
------解决方案--------------------
Private Sub Command1_Click()
Dim i As Integer, j As Integer, n As Integer
For i = 100 To 1 Step -1
List1.AddItem i
Next i
For i = 0 To 25 '已知需 26 个列表,可根据应用需要调整
n = 200
Do
For j = 0 To List1.ListCount - 1
If List1.List(j) <= n Then
Debug.Print List1.List(j),
n = n - List1.List(j)
List1.RemoveItem j
Exit For
End If
Next j
If List1.ListCount = 0 Then Exit Do
Loop Until n < List1.List(List1.ListCount - 1)