找零钱类组合问题思路小结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

声明:

  本文参考文章:http://www.bkjia.com/ASPjc/1025655.html

问题描述:

  我们知道人民币有1、2、5、10、20、50、100这几种面值。现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。

输入:

 输入有多组,每组一行,为一个整合n。输入以0结束。

输出:

 输出该面额有几种表示方法。

思路:

  1. 这类问题的思路采用递归的思想的思考方式如下

  2. 对于某个数 X 能够由 A1、A2、A3的组合构成的问题,假设 f(x) 表示组合的个数。那么,f(x) 可以分解为存在 A1 的分解和不存在 A1 的分解

  3. 即 f(x) 可以表示为 X-A1 由 A1,A2,A3的组合(存在A1的分解),与 X 由 A2,A3的组合两部分(不存在A1的分解)
  4. 同理,对于递归过程的任意一个数,均可以用这种方式进行描述。但是,需要注意避免重复和截止条件

由此,我采用的解决代码日下:

#include <iostream>
using namespace std;
/*
 日期:2016-02-17
 作者:xieyun
 要求:
  找零钱
*/

int changeMoney(int money, int moneyNum, int index)
{
    /*
        输入:
            money  需要拆分的现金
            moneyNum 组合需要的纸币张数
            index  用于指示拆分情况
        返回:
            组合数量
    */
    int check[7] = {1, 2, 5, 10, 20, 50, 100};

     if(money==0)
     {
        return 1;
     }
     if(money<0 || moneyNum<=0 || index>=7)
     {
      return 0;
     }
    return changeMoney(money-check[index], moneyNum-1, index) //存在A1的分解
            +changeMoney(money, moneyNum, index+1);  //不存在A1的分解
}

int main()
{
    int presentMoney = 0;

    while(1)
    {
        cin>>presentMoney;
        if(presentMoney==0)
        {
            break;
        }
    cout<<changeMoney(presentMoney, 100, 0)<<endl;
    }
    return 0;
}
找零钱最佳组合的测试用例 立即下载

相关推荐

找零钱问题C++实现 找零钱问题

简单的程序,会给你很大的启发,特别是初学者!希望对大家会有帮助

华为面试题【8】-找零钱

题目描述: 我们知道人民币有1、2、5、10、20、50、100种面值。现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有种。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。 输入输入多组每组一行,为一个整合n。输入0结束输出输出面额种表示方法。 样例输入: 1 4 0 样例输出: 1 ...

389

软件测试(单元测试)

试验二 单元测试 【开发语言及实现平台或实验环境】 在Windows 2000(SP2) 或Windows XP 操作系统上,使用C++语言,使用VC6.0开发工具。 【实验目的】 (1) 认识单元测试原理 (2) 掌握单元测试过程 【实验要求】 要求学生能够理解单元测试的相关概念和单元测试的过程、方法。3人一组。 【实验原理】 对给定的要求,采用白盒测试的方法进行单元测试,分别满足语句覆盖、判定覆盖、条件覆盖、条件组合覆盖、路径覆盖。 【实验内容】 (1)找零钱最佳组合 假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。

找零钱问题

人民币有1、2、5、10、20、50、100种面值。 现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有种。 比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。 输入多组每组一行,为一个整合n。 输入0结束输出面额种表示方法。 使用动态规划解决:#include <iostream> #include

TBViwer 863

找零钱

描述:  我们知道人民币有1、2、5、10、20、50、100种面值。现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有种。比如4元,能用4张1元、2张1元和1张2元、2张2元,三种表示方法。   题目别:  循环  难度:  初级  运行时间限制: 10Sec 内存

灯火阑珊处 2275

贪心算法之找零钱问题详细解读(附带Java代码解读)

找零钱问题(Change-making Problem)是计算机科学中一个经典的问题,特别是在贪心算法的背景下非常常见

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 2872

算法-动态规划-背包问题-322. 零钱兑换+(背包问题小结)+完全平方数-C++

01背包问题:最大能装满多少装满有多少种方法问题最少有个物品能装满组合数就是不允许有重复,一般是先遍历物品再遍历背包容量i ++) {// 遍历物品 for(int j = coins [ i ];j ++) {// 遍历背包 if(dp [ j - coins [ i ] ]!// 如果dp[j - coins[i]]是初始值则跳过 dp [ j ] = min(dp [ j - coins [ i ] ] + 1 , dp [ j ]);} } }

weixin_43541510的博客 553

贪婪算法小结

背景介绍:贪婪算法可以说是离我们生活最近的一种算法,人总是贪婪的嘛,所以这种算法的设计是很符合人性的。之所以这么说,是因为人们会在生活中有意无意的使用贪婪算法来解决问题。最常见的就是找零钱了,每个人都没学过该怎么找零钱,但在所有面额的钱都充足时,每个人都会找出同样组合来凑够需要的钱。其实这里面就是贪婪算法在起作用。 设计思路:贪婪法的设计思路可以从两方面来理解,即直观上和数学上。从直观上理解贪婪

让代码改变世界 1万+

算法设计与分析(三)之贪心算法

前面两篇:算法设计与分析之分治思想算法设计与分析(二)之动态规划贪心算法的特点设计要素:贪心法适用于组合优化问题。求解过程是多不判断过程,最终的判断序列对应于问题的最优解。依据某种“短视的”贪心选择性质判断,性质好坏决定算法的成败。贪心法必须进行正确性证明。证明贪心法不正确的技巧:举反例。贪心法的优势:算法简单,时间和空间复杂性低最优装载问题问题:n个集装箱1,2,3,…..,n装上轮船,集装箱i

wenhui12345的博客 2354

探究贪心算法:特点与实际应用

作为一名博主,我们常常需要了解并深入探究各种算法,以便能够在解决实际问题时运用自如。在本篇博客中,我们将重点探讨贪心算法,介绍其特点以及如何将其应用到实际问题中去。随着互联网时代的发展,掌握贪心算法的知识将为我们在算法竞赛、工程开发等领域提供强大的技术支持。贪心选择性质:在每一步选择中都采取当前状态下的最优解决方案,即做出局部最优选择。无后效性:当前的选择不会影响以后的选择,即某个阶段的状态一旦确定,就不受之后决策的影响。这意味着贪心算法对于以后的步骤是没有记忆的,只关心当前状态。子问题的最优解。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 2万+

转:贪婪算法小结

背景介绍:贪婪算法可以说是离我们生活最近的一种算法,人总是贪婪的嘛,所以这种算法的设计是很符合人性的。之所以这么说,是因为人们会在生活中有意无意的使用贪婪算法来解决问题。最常见的就是找零钱了,每个人都没学过该怎么找零钱,但在所有面额的钱都充足时,每个人都会找出同样组合来凑够需要的钱。其实这里面就是贪婪算法在起作用。 设计思路:贪婪法的设计思路可以从两方面来理解,即直观上和数学上。从直观上理解贪婪算法就是用最快的方法来解决问题。在这里面“快”是主要目标,例如上面找零钱的例子,假如你要找的零钱为6.6元。那首

391

硬币组合问题找零钱问题的代码

用动态规划和贪心算法实现的硬币组合问题,希望对大家有用!

C语言代码-找零钱

#include int main() { int m1,m2; while(scanf("%d%d",&m1;,&m2;)!=EOF) { int n,c; n=m1-m2; printf("%d\n",n); c=n; if(n>=100) { printf("100*%d",n/100); n=n0; if(n!=0) printf("+"); else printf("=%d\n",c); } if(n>=50) { printf("50*%d",n/50); n=nP; if(n!=0) printf("+"); else printf("=%d\n",c); } if(n>=20) { printf("20*%d",n/20); n=n ; if(n!=0) printf("+"); else printf("=%d\n",c); } if(n>=10) { printf("10*%d",n/10); n=n; if(n!=0) printf("+"); else printf("=%d\n",c); } if(n>=5) { printf("5*%d",n/5); n=n%5; if(n!=0) printf("+"); else printf("=%d\n",c); } if(n>=1) printf("1*%d=%d\n",n/1,c); } return 0; }

算法设计与分析(4)——贪心法

北京大学 屈婉玲老师的MOOC视频:算法设计与分析。 这个课程不仅适用于 算法设计与分析 的学习,也非常适用于 数学建模 的学习,如果是学习 数学建模的基础部分,前两周的内容是非常适合的,如果要进一步学习 建模思想,建议把这十周视频好好看一遍。( •̀ ω •́ )y

xiaobai_qian的博客 4434

zzuli新生训练学习第三天题解

A - 素数判定 ~~ 原网址 http://acm.hdu.edu.cn/showproblem.php?pid=2012 对于表达式n^2+n+41,当n在(x,y)范围内取整数值时(包括x,y)(-39<=x<y<=50),判定该表达式的值是否都为素数。 Input 输入数据有多组每组一行,由两个整数x,y组成,当x=0,y=0时,表示输入结束,该行不做处理。 Outp...

weixin_45926600的博客 6667

找零钱最佳组合,实验报告(请结合等价划分法和边界值分析法为上述程序设计出相应的测试用例)

找零钱最佳组合,实验报告(请结合等价划分法和边界值分析法为上述程序设计出相应的测试用例),假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。

weixin_48026854的博客 1万+

【等价划分法】某商店的货品价格(P)都不大于 20 元(且为整数),假设顾客每次付款为 20 元且每次限购一件商品,现有一个软件能在每位顾客购物后给出找零钱的最佳组合(找给顾客货币张数最少)。

【等价划分法】某商店的货品价格(P)都不大于 20 元(且为整数),假设顾客每次付款为 20 元且每次限购一件商品,现有一个软件能在每位顾客购物后给出找零钱的最佳组合(找给顾客货币张数最少)。...

weixin_48176779的博客 4062
上一篇: 在 Visual Studio 2012 中完成配置华为软件入职前练习的CppUnit测试
下一篇: C/C++的字符串流
新手橙
博客等级 码龄15年 14粉丝 19原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值