贪婪算法实例:换零钱(VB.net代码)

Public Class frmMoney
    Const conMax = 9
    Public intValue(conMax) As Integer

    Private Sub frmMoney_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        lblTell.Text = "贪婪算法追求最快得到结果的算法,它可能不是最优解。" & vbCrLf &
            "例如找零钱的组合可能有很多,贪婪算法从大面值到小面值按每种面值最大可能来考虑。"
        lblMoney.Text = "零钱数额"

    End Sub

    Private Sub btnMoney_Click(sender As Object, e As EventArgs) Handles btnMoney.Click
        intValue = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10}
        Dim intNum(conMax) As Integer
        If IsNumeric(txtMoney.Text) Then
            Dim intMoney As Integer
            Try
                intMoney = CInt(txtMoney.Text * 100)  '转换成整数,也就是按分来计算,不是按元来计算
                If intMoney > 0 AndAlso intMoney < 10000 Then
                    '找零钱计算
                    exchange(intMoney, intNum)
                    '显示结果
                    '先清除列表原有数据
                    lstMoney.Items.Clear()
                    '列出不同面值的张数
                    For intI As Integer = 0 To conMax
                        lstMoney.Items.Add("面值" & intValue(intI) / 100 & "" & intNum(intI) & "张")
                    Next
                Else
                    MsgBox("错误,零钱数额超出合理范围,请重新输入")
                End If
            Catch ex As Exception
                MsgBox("错误,数字超出范围")
            End Try
        Else
            MsgBox("错误,不是数字")
        End If
    End Sub

    Private Sub exchange(ByVal intMoney As Integer, ByRef intNum() As Integer)
        '贪婪算法,从大面值到小面值,每种面值取最大可能
        intValue = {10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10}
        Dim intI, intJ As Integer
        '分值四舍五入
        If intMoney Mod 10 >= 5 Then
            intMoney = (intMoney \ 10 + 1) * 10
        Else
            intMoney = (intMoney \ 10) * 10
        End If
        '贪婪算法
        For intI = 0 To conMax
            If intMoney >= intValue(intI) Then
                For intJ = 1 To conMax
                    If intMoney >= intJ * intValue(intI) Then
                        intNum(intI) = intJ
                    Else
                        intMoney = intMoney - (intJ - 1) * intValue(intI)
                        Exit For
                    End If
                Next
            ElseIf intMoney = 0 Then
                Exit For
            End If
        Next
    End Sub

    Private Sub 作品集ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 作品集ToolStripMenuItem.Click
        Process.Start("https://pan.baidu.com/s/1jr_3Yt5l1i6jNNbMy4R61A")
        My.Computer.Clipboard.Clear()
        My.Computer.Clipboard.SetText("5ycz")
        MsgBox("提取码5ycz已复制,直接到网页粘贴即可")
    End Sub

    Private Sub 更新下载ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 更新下载ToolStripMenuItem.Click
        Process.Start("https://pan.baidu.com/s/18R8VmtMD8y7gE87sBeve9A")
        My.Computer.Clipboard.Clear()
        My.Computer.Clipboard.SetText("ewce")
        MsgBox("提取码ewce已复制,直接到网页粘贴即可")
    End Sub

    Private Sub 代码浏览ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 代码浏览ToolStripMenuItem.Click
        Process.Start("https://blog.csdn.net/kguncn/article/details/109262613")
    End Sub
End Class
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值