0

0

找零钱的两种方法

PHP中文网

PHP中文网

发布时间:2016-05-24 12:52:59

|

3758人浏览过

|

来源于php中文网

原创

有时候,去便利店买几块钱的东西,但没有零钱,只能给他们一张100的,他们可能找给我一沓10块的和几枚硬币。我不喜欢这么多的零钱,要知道,钱越零散,散失地就越快,我希望找给我的零钱张数最少。

如何找出最少数目(钱的张数)的零钱呢?这个问题看起来很简单,假设要用50、20、10、5、1(元)找出87元来,任何人都可以简单地得出:1张50、1张20、1张10、1张5和2张1元就可以满足。可以用代码表示出来:

public static int[] MakeChange(int money, int[] changes)
{
    int[] result = new int[changes.Length];

    for (int i = 0; i < changes.Length; i++)
    {
        result[i] = money / changes[i];
        money = money % changes[i];

        if (money == 0) { break; }
    }

    return result;
}

输入money=87,changes={ 50, 20, 10, 5, 1 },则结果为:{ 1, 1, 1, 1, 2 }。这种方法的特点是:从最大额的零钱开始,逐次凑出需要的数额来,不关心总的数目是否真的是最小。这样的算法也形象地称为“贪心算法”,而找出最少数目的零钱的问题称为“最优化问题”。在某些情况下,贪心算法未必能得到最优的解,比如恰好10元和5元没有了,只剩下50、20和1元,这时要找出60元,需要1张50和10张1元,而实际上只要3张20就可以了。如果各种零钱是充足的,则可以证明贪心算法得到的解也是最优解。

零钱的集合是 { 50, 20, 10, 5, 1 },记为C。对于一个特定的数额n,它的最优解记为q。那么q中至多有2个20,因为如果有3个的话,可以用1张50和1张10来代替3张20;如果有2张20,则不能有10元的,否则可以用1张50来代替,同理最多有1张5和4张1,这样可以确定如果有2张20,则在q中小于50的零钱总数在40和49之间;同理如果只有1张20的,则最多有1张10、1张5和4张1,总数在20和39之间;如果没有20,则最多有1张10、1张5和4张1,总数在0和19之间。总之,在最优解中,小于50的零钱总数在0到49之间【结论1】。有了这个结论,下面来证明上述问题中,贪心算法得到的解也是最优解。

还是使用上面的标记:零钱集合C,数额n,最优解q,假设贪心算法得到的解是q’。用q50表示q中50元的个数,q’50表示q’中50元的个数,由于q’中包含尽可能多的50,所以q50

如果各种零钱充足,现在是没问题了,如果某些零钱没有了,贪心算法未必能得到最优解,这时该如何求解呢?为简化问题,我们假设1元的钱总是充足的,所以解总是存在的。对于数额n,可做如下考虑:

1)如果n = 1,则用1个1元来找零,这就是最优解;

两种html5图片展示效果
两种html5图片展示效果

两种html5图片展示效果,动画效果流畅,兼容主流浏览器,php中文网推荐下载! 使用方法: 1、在head区域引入样式表文件app.css,index.css和fonts.css 2、在你的网页中加入注释区域代码即可 3、图标均使用Web开放字体,具体文件见css目录

下载

2)如果n > 1,则对于每个可能的值i,分别找出i元和n-i元来。

通过这样的递归,可以找出所有可能的解来,这样就可以找到最优解来了。不过该方法效率不高,因为存在大量冗余的计算,比如要找出60元,中间需要计算59,要计算59则一定需要计算58。。。而且这些计算要重复多次,这种情形称为“递归爆炸”。这里很像使用递归来求解Fibonacci数列一样,存在很大的效率问题。在优化Fibonacci数列的计算时,一种方法是将计算过的值存放在一个数组里,以供重复使用,这里也可以采用这样的思路。

public static void MakeChangeDynamically(int money, int[] changes, int[] changesUsed, int[] lastChange)
{
    changesUsed[0] = 0;
    lastChange[0] = 1;
    for (int dollars = 1; dollars <= money; dollars++)
    {
        // 至少可以全部使用1元来找零
        int minChangeCount = dollars;
        int newChange = 1;

        for (int j = 0; j < changes.Length; j++)
        {
            if (changes[j] > dollars)
            {
                continue; // 不能使用该数额来找零
            }

            // 如果使用这个数额来找所需要的数目更小
            if (changesUsed[dollars - changes[j]] + 1 < minChangeCount)
            {
                minChangeCount = changesUsed[dollars - changes[j]] + 1;
                newChange = changes[j];
            }
        }

        changesUsed[dollars] = minChangeCount;
        lastChange[dollars] = newChange;
    }
}

这个方法属于动态规划的应用。假设现在要找的数额为67,changes = { 1, 5, 10, 20, 50 },changesUsed数组会保存从1到66之间的数值分别需要多少张零钱,在求解67的时候,会这样考虑:对于changes的每个数值,将67拆分为1+66,5+62,10+57,20+47,50+17,由于66、62、57、47、17这些值都已计算过,所以可以迅速得出对于67找零需要几张零钱;同时lastChange数组保存了从1到66之间的数值的最优解中,它们所使用的最后一张零钱是什么,这样回推过去,不但可以知道用几张零钱,还可以知道这些零钱的数额分别是什么。

虽然如此,在日常生活中找零钱的时候,两种方法都不需要,心算即可:)

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

68

2026.02.11

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

200

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

40

2026.02.11

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

4

2026.02.11

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

6

2026.02.11

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

159

2026.02.10

MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

89

2026.02.10

谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程
谷歌邮箱网页版登录与注册全指南_Gmail账号快速访问与安全操作教程

本专题汇总了谷歌邮箱网页版的最新登录入口和注册方法,详细提供官方账号快速访问方式、网页版操作教程及安全登录技巧,帮助用户轻松管理Gmail邮箱账户,实现高效、安全的邮箱使用体验。

78

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 11.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号