示例:删数问题
链盘输入一个高精度的数N,去掉任意S个数字后剩下的数字按原左右次序组成一个新的正整数,编程对于给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
为了便于操作,将N做为字符串的形式输入,可以使用尽可能逼近目标的贪心算法来完成,删数的过程中是一个一个进行删除的,为了保证最后得到的数最小,每一步总是要删除使剩下的数最小的数字。之所以做出这样贪心的选择,是因为删S个数字的最优解,包含了删除一个数字的子问题的最优解。
为了实现上述目的,我们可以进行S次选择,每次都选择N中最大的数字,此数字选择后将不再参与下次的选择。具体实现请看源程序。
语言、界面、源程序
(1)语言
程序中通过Virual BASIC6.0语言来实现。
(2)界面
界面非常简单,建立一标准EXE工程,其caption设为“删数问题”。放入三个文本框和两个按钮,文本框起到输入两个数和输出结果的作用,按钮用来控制执行,再放入三个标签起到说明的作用。
(3)源程序
Private Sub CmdDelnum_Click()'开始删数按钮
Dim i As Integer
Dim j As Integer
Dim n As String '原数
Dim s As Integer '删数的个数
Dim nlength As Integer 'N的长度
Dim a() As Integer '放位数数组
Dim k As Integer '记录最大值位置
TxtOutput.Text = ''
n = TxtNum.Text
s = Val(TxtS.Text)
nlength = Len(n)
ReDim a(nlength - 1)
'将各位的值放入数组
For i = 0 To nlength - 1
a(i) = Mid(n, i + 1, 1)
Next i
'执行贪心算法s步
For j = 1 To s
k = 0
For i = 1 To nlength - j
If a(k) < a(i) Then
k = i
End If
Next i
d = a(k)
For i = k To nlength - 1 - j
a(i) = a(i + 1)
Next i
a(nlength - j) = d
Next j
'输出结果
For i = nlength - 1 To nlength - s Step -1 '删数过程
TxtOutput.Text = TxtOutput.Text + '删除的第' + Str(nlength - i) + '个数'+ Str(a(i)) + vbCr + vbLf
Next i
'最后的数
For i = 0 To nlength - s - 1
TxtOutput.Text = TxtOutput.Text + Str(a(i))
Next i
End Sub
(上程序在VB60 Win2000下调试通过)
小结
这就是有趣的贪心算法,说是贪得无厌可以,说是守住当前的既得利益,以此为基础,再稳扎稳打地进行下一步也行!
滴水不漏——列举法破解难题 问:“列举法是种什么样子的算法呢?”
答:“列举法是比贪心法还要贪得多的算法,列举法也是一种比较笨但却很有效的算法,他想要的东东,一种情况他都不想落下,大有宁可错杀一千,不可放过一个的阵势。下面举例说明。”
什么是列举法
列举是针对问题所有的可能一一查看是不是符合条件,有些“宁肯错杀一千,不可放过一个”的作风。下面的老题最能说明这种情况。
示例:百钱买百鸡
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-34162-8.html
这个世界超级军事强国