frmPak.frm
上传用户:sdxhx123
上传日期:2022-08-06
资源大小:3453k
文件大小:5k
开发平台:

Visual Basic

  1. VERSION 5.00
  2. Begin VB.Form frmPak 
  3.    Caption         =   "回溯法求解背包问题"
  4.    ClientHeight    =   8220
  5.    ClientLeft      =   60
  6.    ClientTop       =   465
  7.    ClientWidth     =   10005
  8.    Icon            =   "frmPak.frx":0000
  9.    LinkTopic       =   "Form1"
  10.    Picture         =   "frmPak.frx":030A
  11.    ScaleHeight     =   8220
  12.    ScaleWidth      =   10005
  13.    StartUpPosition =   3  '窗口缺省
  14.    Begin VB.TextBox Text1 
  15.       BackColor       =   &H00C0FFFF&
  16.       BeginProperty Font 
  17.          Name            =   "隶书"
  18.          Size            =   15
  19.          Charset         =   134
  20.          Weight          =   400
  21.          Underline       =   0   'False
  22.          Italic          =   0   'False
  23.          Strikethrough   =   0   'False
  24.       EndProperty
  25.       Height          =   4335
  26.       Left            =   600
  27.       MultiLine       =   -1  'True
  28.       TabIndex        =   2
  29.       Top             =   960
  30.       Width           =   4335
  31.    End
  32.    Begin VB.CommandButton Command2 
  33.       Caption         =   "退出"
  34.       BeginProperty Font 
  35.          Name            =   "隶书"
  36.          Size            =   15
  37.          Charset         =   134
  38.          Weight          =   700
  39.          Underline       =   0   'False
  40.          Italic          =   0   'False
  41.          Strikethrough   =   0   'False
  42.       EndProperty
  43.       Height          =   495
  44.       Left            =   6480
  45.       TabIndex        =   1
  46.       Top             =   6600
  47.       Width           =   1815
  48.    End
  49.    Begin VB.CommandButton Command1 
  50.       Caption         =   "录入数据"
  51.       BeginProperty Font 
  52.          Name            =   "隶书"
  53.          Size            =   15
  54.          Charset         =   134
  55.          Weight          =   700
  56.          Underline       =   0   'False
  57.          Italic          =   0   'False
  58.          Strikethrough   =   0   'False
  59.       EndProperty
  60.       Height          =   495
  61.       Left            =   1680
  62.       TabIndex        =   0
  63.       Top             =   6600
  64.       Width           =   1815
  65.    End
  66.    Begin VB.Line Line1 
  67.       X1              =   5520
  68.       X2              =   5520
  69.       Y1              =   600
  70.       Y2              =   5760
  71.    End
  72.    Begin VB.Label Label1 
  73.       BackColor       =   &H00C0FFFF&
  74.       BackStyle       =   0  'Transparent
  75.       Caption         =   $"frmPak.frx":D8EA
  76.       BeginProperty Font 
  77.          Name            =   "楷体_GB2312"
  78.          Size            =   14.25
  79.          Charset         =   134
  80.          Weight          =   400
  81.          Underline       =   0   'False
  82.          Italic          =   0   'False
  83.          Strikethrough   =   0   'False
  84.       EndProperty
  85.       ForeColor       =   &H00C0FFFF&
  86.       Height          =   3495
  87.       Left            =   6000
  88.       TabIndex        =   3
  89.       Top             =   1080
  90.       Width           =   3495
  91.    End
  92. End
  93. Attribute VB_Name = "frmPak"
  94. Attribute VB_GlobalNameSpace = False
  95. Attribute VB_Creatable = False
  96. Attribute VB_PredeclaredId = True
  97. Attribute VB_Exposed = False
  98. Private Sub Command1_Click()
  99. Dim i, j, k, Num As Integer
  100. Dim MaxWeight, WR As Integer '定义变量MaxWeight为最大装载量,W为剩余容量
  101. Dim W(), P() As Integer '定义每箱的重量和价值
  102. Dim F() As Integer '最优值函数
  103. Dim X() As Integer '表示那些物品被放入。放入的是1,否则为零
  104. Num = Val(InputBox("请输入物品数量:")) '输入箱数和MaxWeight
  105. Text1 = "物品个数为" & Num & ";" & vbCrLf
  106. MaxWeight = Val(InputBox("背包容量为:"))
  107. Text1 = Text1 & "背包的容量为" & MaxWeight & ";" & vbCrLf
  108. ReDim W(1 To Num) '重新定义动态数组大小
  109. ReDim P(1 To Num)
  110. ReDim F(0 To Num, 0 To MaxWeight)
  111. ReDim X(1 To Num)
  112. '输入每个物品的重量和价值
  113. For j = 1 To Num
  114.   W(j) = Val(InputBox("第" & j & "个物品的重量为:"))
  115.   P(j) = Val(InputBox("第" & j & "个物品的价值为:"))
  116.   Text1 = Text1 & "第" & j & "个物品的重量为" & W(j) & ",价值为" & P(j) & ";" & vbCrLf
  117. Next j
  118. For i = 1 To Num
  119.     F(i, 0) = 0  '清零
  120.     For WR = 1 To MaxWeight
  121.        If W(i) <= WR Then
  122.            If P(i) + F(i - 1, WR - W(i)) > F((i - 1), WR) Then
  123.                F(i, WR) = P(i) + F(i - 1, WR - W(i))
  124.            Else
  125.                F(i, WR) = F(i - 1, WR)
  126.            End If
  127.        Else
  128.          F(i, WR) = F(i - 1, WR)
  129.        End If
  130.     Next WR
  131. Next i
  132. Text1 = Text1 & "最大价值为" & F(Num, MaxWeight) & ";" & vbCrLf
  133. '从后往上找最优解
  134. For m = Num To 2 Step -1
  135.   If F(m, MaxWeight) = F(m - 1, MaxWeight) Then
  136.     X(m) = 0
  137.   Else
  138.     X(m) = 1
  139.     MaxWeight = MaxWeight - W(m)
  140.   End If
  141. Next m
  142.    
  143. '对X(1)单独讨论
  144. If F(1, MaxWeight) = 0 Then
  145.    X(1) = 0
  146. Else
  147.    X(1) = 1
  148. End If
  149. '输出物品序号
  150. For i = 1 To Num
  151.     temp = temp + X(i)
  152. Next i
  153. If temp = 0 Then
  154.     Text1 = Text1 & "没有物品可以放入背包。"
  155. Else
  156.     For i = 1 To Num
  157.         If X(i) <> 0 Then Text1 = Text1 & i & " "
  158.     Next i
  159.     Text1 = Text1 & "号物品被放入背包。"
  160. End If
  161. End Sub
  162. '退出程序
  163. Private Sub Command2_Click()
  164.     Unload Me
  165. End Sub