100块钱有多少组成方式
题目是问100块钱用现有的币值,有多少组成方式。
要注意的是,一开始用float,发现 5 / 0.1算出来是49.999多,原来浮点数是有误差的,所以大家都*10,用整数来除。
方法一:用递归
#include <iostream>
using namespace std;int num[8];
int money[8] = {1, 5, 10, 50, 100, 200, 500, 1000};
int nums = 0;
float total;void f(int index, float current)
{if (index >= 8)return;if (current > total)return;if (index == 7 && current == total){nums++;for (int i = 0; i < 8; i++){cout << float(float(money[i])/10) << " : " << num[i] << ", ";}cout << endl;}for (int i = 0; i <= (total-current) / money[index]; i++){num[index] = i;f(index + 1, current + money[index] * num[index]);}
}int main()
{cin >> total;total = total * 10;for (int i = 0; i < 8; i ++){num[i] = 0;}int current = 0;f(0, current);cout << nums << endl;nums = 0;
}
但是,用递归算法效率差了点,想想是否可以用DP。
方法二:用DP
效率变快好多。
f[k] 记录组成k元有多少组成方式。
当遍历到money[i]时,f[k]记录的是用money[0] - money[i-1]的币值可以组成k元的组成方式的个数。
那么到money[i]时,观察f[k],如果f[k] > 0,代表之前可以组成k元,然后加入j个money[i] 就可以组成k+money[i] * j 元。
且k+money[i] * j 元的组成方式的个数要加上f[k]。
用数组g代表当前money[i]时的情况,否则新产生的值会和上一轮的f的值混淆。到这一轮结束以后,再把g的值加到f的值之上即可。
想起来这道题好像以前做过类似的:)
#include <iostream>
using namespace std;int money[8] = {1, 5, 10, 50, 100, 200, 500, 1000};int main()
{int N;cin >> N;while(N-- > 0){int total;cin >> total;total = total * 10;long long *f = new long long[total+1];long long *g = new long long[total+1];for (int i = 0; i <= total; i ++){f[i] = 0;g[i] = 0;}for (int j = 1; j <= total / money[0]; j++){f[money[0] * j]++;}for (int i = 1; i < 8; i++){for (int j = 1; j <= total/ money[i]; j++){g[money[i] * j]++;}for (int k = 0; k <= total; k++){if (f[k] > 0){for (int j = 1; j <= (total - k) / money[i]; j++)g[k + money[i] * j] += f[k];}}for (int k = 0; k <= total; k++){f[k] += g[k];g[k] = 0;}}cout << f[total] << endl;}
}
100块钱有多少组成方式相关推荐
- 入职三天,公司给了100块钱叫我走人
十月,金秋季节,本是丰收之时,却因为陆续有同事离职,心中多少有些悲凉之意,顿然想起从参加工作到现在,五年已过,当年青涩懵懂的小年轻,如今出街招摇过市时,被小孩子看到都会喊声大叔.回想这五年,有心酸和无 ...
- 入职三天,公司给了100块钱叫我走人!
本文来源公众号:编程无界,是作者本人的亲身经历,希望对大家有所帮助! 十月,金秋季节,本是丰收之时,却因为陆续有同事离职,心中多少有些悲凉之意,顿然想起从参加工作到现在,五年已过,当年青涩懵懂的小年轻 ...
- 入职三天,公司给了100块钱叫我走人| 掘金技术征文
十月,金秋季节,本是丰收之时,却因为陆续有同事离职,心中多少有些悲凉之意,顿然想起从参加工作到现在,五年已过,当年青涩懵懂的小年轻,如今出街招摇过市时,被小孩子看到都会喊声大叔.回想这五年,有心酸和无 ...
- 如何在2小时内用1块钱赚到100块钱?
本文来源:道君说财(微信公众号:touzijuiebu) 这篇文章将会告诉大家,如何跳出自己的思维去看待问题.跳出思维的盒子,你的生活也会增加许多可能性. 如何在2小时内用1块钱赚到100块钱? 别担 ...
- 用100元买100支笔c语言,用C编程!有100块钱,买100支笔,其中钢笔3元,圆珠笔2元,铅笔0.5元,问各买多少支?...
题目: 用C编程!有100块钱,买100支笔,其中钢笔3元,圆珠笔2元,铅笔0.5元,问各买多少支? 解答: 完整程序如下: main(){ int i3,i2,i05; for (i3=0;i3 猜 ...
- 报表软件公司悬赏 BUG,100块钱1个的真实用意
上一篇文章我讲到,报表软件FineReport一反常态,做了个<提BUG,拿现金>的活动,1个BUG,100块钱.纵览软件行业,如金蝶用友浪潮IBM微软等国内外巨头,均没有这样的举动去征集 ...
- 一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序。...
一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序. public class A {public static void ma ...
- 一道经典的面试题:一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(编写java程序)...
一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序. public class BuyChicken { public stat ...
- 有100块钱,每3块钱可以买一瓶汽水,每3个瓶子可以换一瓶汽水。问最后能买几瓶汽水
package com.ligong;public class Demo51 {public static void main(String[] args) {/** 有100块钱,每3块钱可以买一瓶 ...
最新文章
- SAP WM中阶之LT25确认Group中的TO单据
- Python-OpenCV 处理视频(五): 运动方向判断
- 计算机网络的协议与体系结构
- javascript与DOM的渊源
- mysql 5.7.13安装_安装MySQL 5.7.13
- [arm驱动]linux内核中断编程
- 最幸福的事就是吃饺子
- 初学者Git和GitHub简介(教程)
- 国外html游戏发展历史,17个国外游戏行业的网页设计欣赏
- java服务器代码_简单java服务器
- 零基础学python实战-苦苦发愁学习Python?让你享受 7天 掌握Python的感觉
- Flume-NG源码阅读之Interceptor(原创)
- C#旅程——ListView控件使用
- IDEA web项目导出 war 包
- 接口测试平台代码实现16:吐槽功能后台实现+orm初识
- 将word转换html格式的文件,word 保存成 html格式文件
- 从0到1构建计算机(3/12)--组合逻辑芯片:逻辑门、加法器、ALU
- A - The Fool HDU - 6555
- html把一张图片动态的代码,原神:4张动态图演示168皮肤琴的实机效果,三种玩家可入手...
- 获取手机的IMEI与IMSI
热门文章
- [逆向]汇编JCC指令举例
- Redis配置文件详解
- 大学生开学必备物品清单男生2022 大学生开学必备物品男生
- 边工作边学习的现实选择
- conda 导出环境文件的方法(文件方法)
- python24小时12小时转换_Python上24小时时间转换为12小时制(ProblemSetQuestion)
- tikz包 安装_TeX系列: tikz pgf 宏包安装步骤
- Java绘图,图像处理
- 2021-2025年中国脱水泵行业市场供需与战略研究报告
- 有向图的强联通分量之:【求最长链】【求最长链的方案数(图论中的方案数DP)】【最长链和最大半联通子图 节点数相同】【最长链与最大半联通子图等价又不完全等价】