前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一题C++版(拼凑面额)

每日一题C++版(拼凑面额)

作者头像
小白学视觉
发布2019-10-24 01:00:23
6010
发布2019-10-24 01:00:23
举报

编程是很多偏计算机、人工智能领域必须掌握的一项技能,此编程能力在学习和工作中起着重要的作用。因此小白决定开辟一个新的板块“每日一题”,通过每天一道编程题目来强化和锻炼自己的编程能力(最起码不会忘记编程)

特别说明:编程题来自“牛客网”和“领扣”以及热心小伙伴的题目。由于小白有时想锻炼某一类编程方法,所以提供的代码不一定是最优解,但是本文提供的编程代码均为通过测试代码。

拼凑面额

题目描述

给你六种面额1、5、10、20、50、100元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0-10000的非负整数)的不同组合的个数。

输入描述:

输入为一个数字N,即需要拼凑的面额

输出描述:

输出也是一个数字,为组成N的组合个数。

示例

输入

5

输出

2

解析

最喜欢和钱有关的题目,谁给小白十个亿,小白也能一个月把它花掉。本题其实就是给定一个整数和一个数组,查看有多少种相加的组合方式。我们可以换一种思考方式,比如我们有一张10元钱,其某种组成方式中有一张5元钱,见变成了:(10-5)元钱有多少种组合方式,这样一直循环下去,最后变成0元钱。

利用这种想法,我们可以使用递归的方法来求取结果。但是这里面有一个小小的注意事项,就是递归的循环中后面减去的纸币面值应该大于等于前一次循环的面值。为实现这个需求,需要将当前循环的纸币面值也传入下一次递归中。

代码

代码语言:javascript
复制
#include <iostream>
#include <vector>

using namespace std;

class Solution
{
public:
  
  int count = 0;
  vector<int> money;
  Solution(){};
  Solution(vector<int> money_) :money(money_){}
  void kindofway(int sum, int i)
  {
    int index = money.size();
    for (; i < index; i++)
    {
      int last = sum - money[i];
      if (last==0)
      {
        count++;
        break;
      }
      else if (last>0)
      {
        kindofway(last, i);
      }
      else
      {
        break;
      }
    }
  }

private:

};

int main()
{
  int sum;
  vector<int> money = { 1, 5, 10, 20, 50, 100 };
  while (cin>>sum)
  {
    Solution solution(money);
    solution.kindofway(sum, 0);
    int count = solution.count;
    cout << count << endl;
  }
  return 0;
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 拼凑面额
    • 题目描述
      • 解析
        • 代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档