贪心算法-找零钱(C#实现)

找零钱这个问题很清楚,无非就是始终拿可以取的最大面值来找,最后就使得张数最小了,这个实现是在假设各种面值足够多的情况下。

首先拖出一个界面来,最下面是一个listbox控件

对应的代码:问题比较简单,有注释

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

private void buttonOk_Click(object sender, EventArgs e)
        {
            if (listMoney.Items.Count != 0)   //第二次计算就清空,便于重复计算
                listMoney.Items.Clear();

var money = Exchange(Convert.ToDecimal(txtMoney.Text));

foreach (var single in money)
            {
                if (single.Value != 0)
                {
                    string s = string.Format("{0}元---->{1}张 ", single.Key, single.Value);
                    listMoney.Items.Add(s);
                }
            }

}
        Dictionary<decimal, int> GetInit()  //初始化字典
        {
            Dictionary<decimal, int> money = new Dictionary<decimal, int>();

//key表示钱,value表示钱的张数
            money.Add(100.00M, 0);
            money.Add(50.00M, 0);
            money.Add(20.00M, 0);
            money.Add(10.00M, 0);
            money.Add(5.00M, 0);
            money.Add(2.00M, 0);
            money.Add(1.00M, 0);
            money.Add(0.50M, 0);
            money.Add(0.20M, 0);
            money.Add(0.10M, 0);

return money;
        }

Dictionary<decimal, int> Exchange(decimal num)
        {
            var money = GetInit();

int i = 0;

while (true)
            {
                if (num < 0.1M)
                {
                    if (num > 0.05M)
                    {
                        money[0.10M]++; //大于0.05的时候给顾客0.1.
                        return money;
                    }
                    else
                        return money;  //否则就算了
                }

var max = money.Keys.ElementAt(i);  //取得面值

if (num >= max)
                {
                    num = num - max;
                    money[max] ++;   //money的张数自增
                }
                else
                    i++;  //就去取下一张面值
            }
        }
    }
}

时间: 2024-10-13 16:30:53

贪心算法-找零钱(C#实现)的相关文章

贪心算法——找零钱问题

//贪心算法 //有三种硬币:10,5,1:给定num元,以最少的硬币数来换它 function greedy(num){ var n10=0, n5=0, n1=0; if(num>=10){ n10= Math.floor(num/10); num= num%10; } if(num>=5){ n5= Math.floor(num/5); num= num%5; } if(num<5){ n1= num; } console.log('10元:'+n10+'枚 5元:' + n5+

贪心算法换零钱(java)

贪心算法思想 贪心算法总是做出在当前看来做好的选择.也就是说贪心算法并不从整体最后考虑,他做出的选择只是局部最优选择.他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解. 1.算法思路 贪心算法是一种不追求最优解,只希望得到较为满意解的方法.贪心算法一般可以快速得到满意的解,因为它省去了为找最优姐要穷尽所有肯呢个而必须耗费大量时间.贪婪(心)算法是一种改进了的分级处理方法.其核心是根据题意选取一种

高级算法——贪心算法(找零问题)

function makeChange(origAmt, coins) {//贪心算法——找零问题 var remainAmt ; if (origAmt % .25 < origAmt) { coins[3] = parseInt(origAmt / .25); remainAmt = origAmt % .25; origAmt = remainAmt; } if (origAmt % .1 < origAmt) { coins[2] = parseInt(origAmt / .1); r

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完

贪心算法解硬币找零问题

假如有一种货币,它有面值为1分.2分.5分和1角的硬币,最少需要多少个硬币来找出K分钱的零钱? 按照贪心算法的思想,需要不断地使用面值最大的硬币.如果要找零的值小于最大的硬币值,则尝试第二大的硬币,依次类推. 代码如下: #include <iostream> using namespace std; #define ONE 1 #define TWO 2 #define FIVE 5 #define TEN 10 int main() { int money; int one=0,two=0

某种 找换硬币问题的贪心算法的正确性证明

一,问题介绍 最近一直在看贪心算法的正确性证明(如何证明贪心算法获得的解一定是最优解),感觉“剪枝”技巧用得比较多.再看了下<算法导论>中贪心算法一章里面的一个练习---找换硬币问题.这个问题对于某些 面值的硬币 是有最优解的,故记录下其中的一些证明思路. 考虑用最少的硬币数 来找 n 分钱的问题,假设每个硬币的值都是整数. 如果可换的硬币的单位是 c 的幂,也就是 c0,c1,... ,ck ,其中整数 c>1,k>=1 证明贪心算法总可以产生一个最优解. 二,找换硬币的贪心策略

找零钱——贪心

找零钱? 有 100 元.50 元.20 元.10 元.5 元和 1 元这些面值的钱? 求凑出 ?? 元的最多张数和最少张数,要求第 ?? 种面值的钱不能用超过 ???? 张? 多组询问,?? ≤ 10^5, ????, ?? ≤ 10^9 题解: 其实我们只要知道最少张数即可. 最大=凑出∑ai-x的最小方案数.max=n-min 发现,如果没有20,那么剩下的100/50/10/5/1成倍数关系可以直接贪心 如果有了20怎么办? 那么,20能用几张呢? 是否可以被50替换呢? 50*2=20

贪心算法解决钱币找零问题

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Coin { class Program { static void Main(string[] args) { int[] value = new int[] { 1, 2, 5, 10, 20, 50, 100 }; int[] count =

入门级贪心算法——java实现

贪心算法入门 贪心算法是一种思路,而不是一种公式. 认真看,一会儿就会了! 个人网站:多猫影视(能看各大vip视频)www.duomao.xyz package com.niu.test; import java.util.Scanner; /** * Created by Administrator on 2017/9/28. */ public class TanXin1 { /** * 贪心算法,找零钱 * 假设有100 50 10 1零钱供找零,输入找零的钱返回找零的钱和张数 * * 思