求助:多个背包的背包问题

wjn7757576 2014-03-10 01:55:46
有一个数组,包含有N个降序排列的数,例如:100,99,98....1,0。 N的大小不确定
要求从第一个数(100)开始,将这些数排到列表中,并要求该列表数字之和不超过200,若超过200,则将该数放入下一张列表并检验该表是否超过200,若超过则将该数放入在下一张列表检验。 每个数都要从第一张列表开始检验,看看是否满足,若不满足则放入第二张表检验,若在不满足则放入第三张...
例如:100,99, 气候的98~2都放入其他表,最后的1和0可以放入第一张表,因为100+99+1+0不超过200
同样,其他表也需要进行这种检验。 类似于多个背包的背包问题。
求思路及代码~~~
...全文
1348 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2014-03-10
  • 打赏
  • 举报
回复
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)
        
        Debug.Print "n = " & n
    Next i
End Sub
结果
100           99            1             n = 0
98            97            5             n = 0
96            95            9             n = 0
94            93            13            n = 0
92            91            17            n = 0
90            89            21            n = 0
88            87            25            n = 0
86            85            29            n = 0
84            83            33            n = 0
82            81            37            n = 0
80            79            41            n = 0
78            77            45            n = 0
76            75            49            n = 0
74            73            53            n = 0
72            71            57            n = 0
70            69            61            n = 0
68            67            65            n = 0
66            64            63            7             n = 0
62            60            59            19            n = 0
58            56            55            31            n = 0
54            52            51            43            n = 0
50            48            47            46            8             n = 1
44            42            40            39            35            n = 0
38            36            34            32            30            28            2             n = 0
27            26            24            23            22            20            18            16            15            6             3             n = 0
14            12            11            10            4             n = 149
雨林T 2014-03-10
  • 打赏
  • 举报
回复
这个很好弄啊! 我先用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

2,506

社区成员

发帖
与我相关
我的任务
社区描述
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
社区管理员
  • VBA
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧