从1元、2元和5元的钞票和等于100元的算法问题谈到递归

引入

一直以来,递归思想成为不少新手的拦路虎。同样作为一个新手,我希望这篇文章可以从新手

的角度出发,走入递归。

     如本文标题,相信不少人碰到过这个问题:
“现有面值为1元、2元和5元的钞票(假设每种钞票都足够多),从这些钞票中取出任意张数使

其总面值为100元,问有多少种取法?“

     我们将从这个问题入手,逐步深入。

基本思路

本文我们要学习递归思想,因此对其他解法不作解释。

     一:先简化题目

将题中100元改成10元,即
现有面值为1元、2元和5元的钞票(假设每种钞票都足够多),从这些
钞票中取出任意张数使其总面值为10元,问有多少种取法
以便于我们具体分析;

     二:思路(希望大家可以跟着我的思路走)

        基本规则: 1、每次只取一张钞票,面额小的优先。
      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);
}





  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值