工资袋问题:用贪心算法算出凑满金额所需的最少货币数量

B站影视 港台电影 2025-10-30 07:30 5

摘要:很多同学会觉得 Excel 单个案例讲解有些碎片化,初学者未必能完全理解和掌握。不少同学都希望有一套完整的图文教学,从最基础的概念开始,一步步由简入繁、从入门到精通,系统化地讲解 Excel 的各个知识点。

很多同学会觉得 Excel 单个案例讲解有些碎片化,初学者未必能完全理解和掌握。不少同学都希望有一套完整的图文教学,从最基础的概念开始,一步步由简入繁、从入门到精通,系统化地讲解 Excel 的各个知识点。

现在终于有了,以下专栏,从最基础的操作和概念讲起,用生动、有趣的案例带大家逐一掌握 Excel 的操作技巧、快捷键大全、函数公式、数据透视表、图表、打印技巧等……学完全本,你也能成为 Excel 高手。

用最少的钞票数量凑出所需的金额,有一个专门的名称,叫贪心算法。

计算下图 1 中的金额所需的最小数量的钞票组合,支持人民币标准面额为 100、50、20、10、5、2、1、0.5、0.1、0.05、0.01。

效果如下图 2 所示。

Sub CalculateExactComboDim amount As CurrencyDim result As StringDim denominations As VariantDim counts As IntegerDim i As Integer' 定义面额(元+分,按从大到小排序)denominations = Array(100, 50, 20, 10, 5, 2, 1, 0.5, 0.1, 0.05, 0.01)ReDim counts(LBound(denominations) To UBound(denominations))' 获取金额并验证amount = Round(Range("A2").Value, 2)If amount = denominations(i) Thencounts(i) = Int(amount / denominations(i))amount = Round(amount - (counts(i) * denominations(i)), 2)End IfNext i' 验证是否完全凑齐If amount > 0 ThenMsgBox "警告:剩余 " & amount & " 元无法分配", vbExclamationEnd If' 生成结果result = vbCrLfFor i = LBound(denominations) To UBound(denominations)If counts(i) > 0 Thenresult = result & Format(denominations(i), "0.00") & "元:" & counts(i) & "张" & vbCrLfEnd IfNext i' 输出到B2单元格Range("B2").Value = resultRange("B2").Columns.AutoFitEnd Sub

结果如下。

3. 更改金额后再次运行代码,得到以下结果。

来源:Excel学习世界

相关推荐