当前位置: 首页 > news >正文

找零问题

问题描述:

给定总金额为n(n为正整数)和若干面值为d1=1<d2<d3<...<dj...<dm的硬币(硬币数量无限),求用最小的硬币数凑足金额n的方案。

注:如果n<d1,那么无法用现有的硬币面值找零,为规避这种情况,假定n>=d1;d1=1能够保障任何正整数n都能被准确的找零。

分析:

为了验证其最优子结构的性质,可以这样考虑:

为了求解问题规模为n的最小硬币数量C(n),向前思考一步,C(n)实际上可以认为是从问题规模为n-dj(满足d1<=dj<=n)的基础上在选取面值为dj的硬币而来。求解C(n)只需要求解所有满足条件的子问题n-dj中最小的C(n-dj),那么,C(n)在最小的C(n-dj)基础上加1即可。

其递推关系为:

动态规划实现:

    /*
     * 动态规划实现
     * */
    public static int changeOfLessCoins(int[] ary,int n){
        int m = ary.length;
        int[] aux = new int[n+1];//aux[0]充当哨兵,没事实际含义
        int tmpLest;
        for (int i = 1; i <= n; i++) {
            tmpLest = Integer.MAX_VALUE;
            for (int j = 0; j < m; j++) {
                if (i>=ary[j]) {
                    tmpLest = Math.min(aux[i-ary[j]], tmpLest);//目的在于找出一个最小的tmpLess
                }
            }
            aux[i] = tmpLest+1;
        }
        return aux[n];
    }

贪心算法实现:

    /*
     * 贪心算法实现
     * */
    public static int changeOfLessCoins(int[] ary,int n){
        int length = ary.length;
        int count  = 0;
        while(n>0){
            for (int i = length-1; i >= 0; i--) {//每次从最大的面值开始选择
                if (ary[i]<=n) {
                    n -= ary[i];
                    count++;
                    break;
                }
            }
        }
        return count;
    }

与找零问题类似的还有像完美平方问题

给定一个正整数N,用最少的平方数(1,4,9,26,25...)使得其和等于N。

比如N=13,最少的平方数为13=4+9,只需要4和9两个平方数即可。

 

参考资料:

算法按设计与分析基础.第三版.第十五章

转载于:https://www.cnblogs.com/qcblog/p/7784080.html

相关文章:

  • 自动化java+webdriver常用的一些脚本
  • 一些 Ubuntu 使用的小技巧
  • java 单点登录机制
  • 最长上升子序列nlogn算法
  • JAVA配置环境
  • C# 后台模拟请求一般处理程序
  • Windows平台,Oracle Database和Client并存方式
  • tomcat乱码问题1 (
  • Mysql集群讲解(五) 多主多从环境搭建
  • Oracle导出数据中的prompt,set feedback 等是什么意思
  • 【朝花夕拾】朝花夕拾-Robot Framework实战演练之开篇
  • hdu6242 计算几何
  • 查看iis对应w3wp.exe显示的进程ID号
  • 标准C程序设计七---11
  • ios 基础知识篇 堆和栈的区别
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 30天自制操作系统-2
  • conda常用的命令
  • ES2017异步函数现已正式可用
  • react-native 安卓真机环境搭建
  • Swift 中的尾递归和蹦床
  • Unix命令
  • 成为一名优秀的Developer的书单
  • 基于axios的vue插件,让http请求更简单
  • 类orAPI - 收藏集 - 掘金
  • 力扣(LeetCode)22
  • 爬虫模拟登陆 SegmentFault
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端路由实现-history
  • 前端相关框架总和
  • 试着探索高并发下的系统架构面貌
  • raise 与 raise ... from 的区别
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ![CDATA[ ]] 是什么东东
  • #define与typedef区别
  • (11)MATLAB PCA+SVM 人脸识别
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)Elastix图像配准:3D图像
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (数据结构)顺序表的定义
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转载)虚函数剖析
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • *2 echo、printf、mkdir命令的应用
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET6 命令行启动及发布单个Exe文件
  • .net对接阿里云CSB服务
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .net中应用SQL缓存(实例使用)
  • .ui文件相关
  • @RunWith注解作用
  • []串口通信 零星笔记
  • [AX]AX2012 AIF(四):文档服务应用实例