从1元、2元和5元的钞票和等于100元的算法问题谈到递归
来源:互联网 发布:魔方虚拟光驱软件下载 编辑:程序博客网 时间:2024/04/30 14:38
引入
一直以来,递归思想成为不少新手的拦路虎。同样作为一个新手,我希望这篇文章可以从新手
的角度出发,走入递归。
如本文标题,相信不少人碰到过这个问题:
“现有面值为1元、2元和5元的钞票(假设每种钞票都足够多),从这些钞票中取出任意张数使
其总面值为100元,问有多少种取法?“
我们将从这个问题入手,逐步深入。
基本思路
一:先简化题目
二:思路(希望大家可以跟着我的思路走)
2、当已取钞票总额等于或超过10,则停止取钞,进行相应的判断后选择下一步的策略。3、每次取出的面值必须比放回的钞票大。4、每次取的面值必须大于或等于已取的面值。
现在我们开始去钞票,根据规则1,每次只取一张,我们从面额最小的开始取(面值小优先):第一张:取1元;第二张:取1元;第三张:取1元;
...第九张:取1元;第十张:取1元;此时已取钞票总额为10元,根据规则2,停止取钞,进行判断。(11111 11111)
1.我们发现手里的钞票总额刚好为10,取法数N变为1;
2.然后我们将最后(即第十张)取出的那张1元钞票放回未取钞票中,根据规则3,选择
一张面额为2的钞票放入手中;
此时已取钞票总额为11元,根据规则2,停止取钞,进行判断。(11111 11112)
1.我们发现手里的钞票总额为11,取法数N不变;
2.然后我们将最后取出的那张2元钞票放回未取钞票中,根据规则3,选择一张面额为5的
钞票放入手中;
此时已取钞票总额为14元,根据规则2,停止取钞,进行判断。(11111 11115)
1.我们发现手里的钞票总额为14,取法数N不变;
2.然后我们将最后取出的那张5元钞票放回未取钞票中,并且此时已没有比5面值更大的
钞票选择,因此我们的策略是:将此刻手中的最后取出(即第九张)的那张1元钞票放回
未取钞票中,根据规则3,再选择一张面额为2的钞票放入手中;
此时已取钞票总额为10元,根据规则2,停止取钞,进行判断。(11111 1112)
1.我们发现手里的钞票总额为10,取法数N变为2;
2.然后我们将最后取出的那张2元钞票放回未取钞票中,根据规则3,再选择一张面额为5
的钞票放入手中;
此时已取钞票总额为13元,根据规则2,停止取钞,进行判断。(11111 1115)
1.我们发现手里的钞票总额为13,取法数N不变;
2.然后我们将最后取出的那张5元钞票放回未取钞票中,并且此时已没有比5面值更大的
钞票选择,因此我们的策略是:将此刻手中的最后取出(即第八张)的那张1元钞票放回
未取钞票中,根据规则3,再选择一张面额为2的钞票放入手中;
此时已取钞票总额为9,根据规则4,因此取出一张面额为2的钞票。
此时已取钞票总额为11元,根据规则2,停止取钞,进行判断。(11111 11122)
1.我们发现手里的钞票总额为11,取法数N不变;
2.然后我们将最后取出的那张2元钞票放回未取钞票中,根据规则3,再选择一张
面额为5的钞票放入手中;
此时已取钞票总额为14元,根据规则2,停止取钞,进行判断。(11111 11125)
1.我们发现手里的钞票总额为11,取法数N不变;
2.然后我们将最后取出的那张5元钞票放回未取钞票中,并且此时已没有比5面值更大的
钞票选择,因此我们的策略是:将此刻手中的最后取出那张2元钞票放回未取钞票中,
根据规则3,再选择一张面额为5的钞票放入手中;
此时已取钞票总额为12,根据规则2,停止取钞,进行判断。(11111 115)
1.我们发现手里的钞票总额为12,取法数N不变;
2.然后我们将最后取出的那张5元钞票放回未取钞票中,并且此时已没有比5面值更大的
钞票选择,因此我们的策略是:将此刻手中的最后取出那张(第七张)1元钞票放回
未取钞票中,根据规则3,再选择一张面额为2的钞票放入手中;
此时已取钞票总额8,根据规则4,因此取出一张面额为2的钞票。
此时已取钞票总额为10元,根据规则2,停止取钞,进行判断。(11111 122)
1.我们发现手里的钞票总额为10,取法数N变为3;
2.然后我们将最后取出的那张2元钞票放回未取钞票中,根据规则3,再选择一张
面额为5的钞票放入手中;(以此类推)
..
整个过程,手中钞票的变化过程如下
现有面值为1元、2元和5元的钞票(假设每种钞票都足够多),从这些钞票中取出
任意张数使其总面值为10元,问有多少种取法?N=10
#include <stdio.h>int num=0;void zuhe(int min,int sum){int i;if(sum==10)num++;if(sum>10)return;for(i=min;i<6;){if(i==1){zuhe(1,sum+1);i=2;}else if(i==2){zuhe(2,sum+2);i=5;}else{zuhe(5,sum+5);i=6;}}}int main(){int sum=0;int min=1;zuhe(min,sum);printf("%d",num);}
- 从1元、2元和5元的钞票和等于100元的算法问题谈到递归
- 用1元,2元,5元,10元,20元和50元的纸币组成100元,共有多少种情况
- 用1元,2元,5元,10元,20元和50元的纸币组成100元,共有多少种情况
- 用1元,2元,5元,10元,20元,50元和10元的纸币组成200元,共有多少种情况
- 要将五张100元的大钞票,换成等值的50元,20元,10元,5元一张的小钞票,每种面值至少1张,编程输出所有可能的换法,程序应适当考虑减少重复次数
- 一个很原始的背包问题。。。就是100元换零钱1元,2元,5元,10元,50元。。
- 计算出N元人民币兑换成1元,2元和5元纸币的所有组合
- ACM-5元和10元的经典问题
- 计算100元换成100张5元、1元、5角的穷举算法
- 用1元,2元,5元,10元,20元,50元组合成100元
- 有1元、5元、10元、20元、50元、100元硬币无数个,问100000元的组合方法有多少个
- 用100元换10元、5元和1元的纸币共50张,能换各种纸币多少张。
- 100元 50元 20元 10元 5元 1元 标准尺寸
- 傻子!10元钱和5元钱,为什么他总是捡5元的
- 动态规划:如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
- 1元,3元和5元的硬币若干枚,如何用最少的硬币凑够11元(Java实现)
- 找零钱的张数最少(20元,10元,5元,1元)
- lua 的元表和元表的__index字段
- Attachments in Oracle Form
- Windows 7蓝屏代码含义
- Android ActivityThread(主线程或UI线程)简介
- poj 1141 Brackets Sequence (DP+构造)
-   和空格 在控制台中变为???的解决
- 从1元、2元和5元的钞票和等于100元的算法问题谈到递归
- debian or ubuntu下 anjuta配置
- base lib 1 ----Timestamp
- iOS开发 浅谈开发中的重用
- DW运行很慢,WINDOWS7上面Dreamweaver很慢的解决非方法
- __call__ 函数
- 插入法排序及原理
- net网站提高性能的方法
- CoreMotion框架-iOS设备的核心运动