vb手机号码抽奖程序_vb抽奖小程序_vb60抽奖程序(8)

电脑杂谈  发布时间:2017-02-24 04:05:29  来源:网络整理

示例:删数问题

链盘输入一个高精度的数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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 蒲寿宬
      蒲寿宬

      这个世界超级军事强国

    热点图片
    拼命载入中...