📄 动态规划_01背包问题.frm
字号:
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3135
ClientLeft = 60
ClientTop = 465
ClientWidth = 4845
LinkTopic = "Form1"
ScaleHeight = 3135
ScaleWidth = 4845
StartUpPosition = 3 '窗口缺省
Begin VB.TextBox Text1
Height = 2175
Left = 240
MultiLine = -1 'True
TabIndex = 2
Top = 120
Width = 4335
End
Begin VB.CommandButton Command2
Caption = "退出"
Height = 495
Left = 2760
TabIndex = 1
Top = 2520
Width = 1815
End
Begin VB.CommandButton Command1
Caption = "计算"
Height = 495
Left = 240
TabIndex = 0
Top = 2520
Width = 1815
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Command1_Click()
Dim i, j, k, Num As Integer
Dim MaxWeight, WR As Integer '定义变量MaxWeight为最大装载量,W为剩余容量
Dim W(), P() As Integer '定义每箱的重量和价值
Dim f() As Integer '最优值函数
Dim X() As Integer '表示那些物品被放入。放入的是1,否则为零
Num = Val(InputBox("请输入物品数量:")) '输入箱数和MaxWeight
Text1 = "物品个数为" & Num & ";" & vbCrLf
MaxWeight = Val(InputBox("背包容量为:"))
Text1 = Text1 & "背包的容量为" & MaxWeight & ";" & vbCrLf
ReDim W(1 To Num) '重新定义动态数组大小
ReDim P(1 To Num)
ReDim f(0 To Num, 0 To MaxWeight)
ReDim X(1 To Num)
'输入每个物品的重量和价值
For j = 1 To Num
W(j) = Val(InputBox("第" & j & "个物品的重量为:"))
P(j) = Val(InputBox("第" & j & "个物品的价值为:"))
Text1 = Text1 & "第" & j & "个物品的重量为" & W(j) & ",价值为" & P(j) & ";" & vbCrLf
Next j
'建立动态规划树
For i = 1 To Num
f(i, 0) = 0 '清零
For WR = 1 To MaxWeight
If W(i) <= WR Then
If P(i) + f(i - 1, WR - W(i)) > f((i - 1), WR) Then '动态规划公式
f(i, WR) = P(i) + f(i - 1, WR - W(i))
Else
f(i, WR) = f(i - 1, WR)
End If
Else
f(i, WR) = f(i - 1, WR)
End If
Next WR
Next i
Text1 = Text1 & "最大价值为" & f(Num, MaxWeight) & ";" & vbCrLf
'从后往上找最优解
For m = Num To 2 Step -1
If f(m, MaxWeight) = f(m - 1, MaxWeight) Then
X(m) = 0
Else
X(m) = 1
MaxWeight = MaxWeight - W(m)
End If
Next m
'对X(1)单独讨论
If f(1, MaxWeight) = 0 Then
X(1) = 0
Else
X(1) = 1
End If
'输出物品序号
For i = 1 To Num
temp = temp + X(i)
Next i
If temp = 0 Then
Text1 = Text1 & "没有物品可以放入背包。"
Else
For i = 1 To Num
If X(i) <> 0 Then Text1 = Text1 & i & " "
Next i
Text1 = Text1 & "个物品被放入背包。"
End If
End Sub
'退出程序
Private Sub Command2_Click()
End
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -