纸币的组成问题

题目

纸币的组成问题

描述

用1元,2元,5元,10元,20元,50元和100元的纸币组成n元,共有多少种情况。

分析

此题可使用递归解决

将组成的单数纸币保存到数组,放入如下:

int a[6] = {1, 5, 10, 20, 50, 100};

由前j种组成的纸币n包括两种:

一种是一定包括第j种纸币;即getSumCount(n-a[j], j)

另一种是一定不包括第j种(即由0到j-1种)组成,即getSumCount(n, j-1)

例如:

150元,使用j[5]=100之前的所有币种的组成个数包括:

使用j[5],即getSumCount(n-a[j], j)=getSumCount(150-100, 5)

不使用j[5],即getSumCount(n, j-1)=getSumCount(150, 4)

总的组成个数为:
getSumCount(150, 5)=getSumCount(150-100, 5) + getSumCount(150, 4)

代码

#include<iostream>

using namespace std;

/*
1, 5, 10, 20, 50, 100
*/

int a[6] = {1, 5, 10, 20, 50, 100};

/*
参数n:组成的数n
参数j:使用数据a[6]中的前j+1个数组成n
返回值:返回所有的组成总数
*/
long getSumCount(int n, int j){
    if(n<0) return 0;
    else if(n>=5 && j>=1){
        return getSumCount(n, j-1)+getSumCount(n-a[j], j);
    }else{
        return 1;
    }
}

int main(){
    std::cout << "n=1:: " << getSumCount(1, 5) << std::endl;
    std::cout << "n=6:: " << getSumCount(6, 5) << std::endl;
    std::cout << "n=10:: " << getSumCount(10, 5) << std::endl;
    std::cout << "n=15:: " << getSumCount(15, 5) << std::endl;
    std::cout << "n=17:: " << getSumCount(17, 5) << std::endl;
    std::cout << "n=20:: " << getSumCount(20, 5) << std::endl;
    std::cout << "n=100:: " << getSumCount(100, 5) << std::endl;
    std::cout << "n=171:: " << getSumCount(171, 5) << std::endl;
    std::cout << "n=1000:: " << getSumCount(1000, 5) << std::endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值