【笔记】贪心算法-找零钱(C#实现)
找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下。
首先拖出一个界面来,最下面是一个listbox控件
对应的代码:问题比较简单,有注释
View Code
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9
10 namespace test
11 {
12 public partial class Form1 : Form
13 {
14 public Form1()
15 {
16 InitializeComponent();
17 }
18
19 private void buttonOk_Click(object sender, EventArgs e)
20 {
21 if (listMoney.Items.Count != 0) //第二次计算就清空,便于重复计算
22 listMoney.Items.Clear();
23
24 var money = Exchange(Convert.ToDecimal(txtMoney.Text));
25
26
27 foreach (var single in money)
28 {
29 if (single.Value != 0)
30 {
31 string s = string.Format("{0}元---->{1}张 ", single.Key, single.Value);
32 listMoney.Items.Add(s);
33 }
34 }
35
36 }
37 Dictionary<decimal, int> GetInit() //初始化字典
38 {
39 Dictionary<decimal, int> money = new Dictionary<decimal, int>();
40
41 //key表示钱,value表示钱的张数
42 money.Add(100.00M, 0);
43 money.Add(50.00M, 0);
44 money.Add(20.00M, 0);
45 money.Add(10.00M, 0);
46 money.Add(5.00M, 0);
47 money.Add(2.00M, 0);
48 money.Add(1.00M, 0);
49 money.Add(0.50M, 0);
50 money.Add(0.20M, 0);
51 money.Add(0.10M, 0);
52
53 return money;
54 }
55
56 Dictionary<decimal, int> Exchange(decimal num)
57 {
58 var money = GetInit();
59
60 int i = 0;
61
62 while (true)
63 {
64 if (num < 0.1M)
65 {
66 if (num > 0.05M)
67 {
68 money[0.10M]++; //大于0.05的时候给顾客0.1.
69 return money;
70 }
71 else
72 return money; //否则就算了
73 }
74
75 var max = money.Keys.ElementAt(i); //取得面值
76
77 if (num >= max)
78 {
79 num = num - max;
80 money[max] ++; //money的张数自增
81 }
82 else
83 i++; //就去取下一张面值
84 }
85 }
86 }
87 }