房号 |
i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
人数 |
b(i) |
2 |
0 |
2 |
2 |
0 |
1 |
2 |
1 |
2 |
1 |
0 |
2 |
1 |
0 |
2 |
2 |
下表给出了选择预订房间的过程(区间长度表示预订房间的起始房号到最后一个房号包含的房间数,区间长度值越小,代表预订房间分布越集中),选择最优方案过程如1)2)3)所示
1)从房间号码分布区间长度值最小原则,选择方案2、4、9
2)分布区间长度值相同时,选择预订房间数目最小的,因此选择方案2、9
3)所有可选方案中,优先选择最先成立的(起始房号最小的)方案,最终选择方案2
程序运行界面如下,请完成相应的小题
Const n = 16 '假设酒店总房间数为16
Dim b(1 To n) As Integer 'b数组按房间号顺序存储各房间可入住人数
Function find1(x, y) As Integer
'函数find1(x,y)的作用是从b(x)到b(y)中找到值为1的数组变量的下标,若找不到,返回值为0
End Function
Private Sub Command1_Click( )
Dim s As Integer d As Integer, f as integer, num As Integer, roomnum As Integer
Dim minnum as integer 'minnum 变量存储当前最优方案中的预订房间数目
Dim mindist As Integer 'mindist 存储当前的最小分布区间长度
'所有房间的可入住人数按房间号码顺序存储到数组b 中并显示在list1 中,代码略
num = Val(Text1.Text)
minnum = n: mindist = n :s = 0 : start = 0: f = 0: pos = 0
For i = 1 To n
If b(i) <> 0 Then
j = i: s = 0: roomnum = 0
Do While s < num And j <= n
s = s + b(j)
If b(j) > 0 Then roomnum = roomnum + 1
j = j + 1
Loop
d =
If s = num Then
If d < mindist Or Then
start = i: mindist = d: minnum = roomnum: pos = 0
End If
ElseIf s > num Then '若可入住人数超出,在当前区间内所选房间中取消1个单人间
f = find1(i + 1, j - 2)
If f > 0 Then
If d < mindist Or d = mindist And roomnum-1 < minnum Then
start = i: mindist = d: minnum = roomnum - 1: pos = f
End If
End If
End If
End If
Next i
If start = 0 Then
Label2.Caption = "房间数量不足"
Else
List2.AddItem "预订房间:" + Str(minnum) + "间"
For i = start To
If b(i) > 0 And i <> pos Then
List2.AddItem "房间号:" + Str(i) + ",入住人数:" + Str(b(i))
End If
Next i
End If
End Sub