有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
可以用DP 方法去解:
coins_count[x], 表示已知x元, 可以最少用 coins_count[x] 个硬币来凑出来。
coins_count[x] = min{ coins_count[x - 1] + 1, coins_count[x - 3] + 1, coins_count[x - 5] + 1}
coins_count[11] 表示的数目的等于 : coins_count[10] , coins_count[8], coins_count[6] 中的最小值, 加 1。 比如 coins_count[8] 最小, 说明 8 元 最少需要 coins_count[8] 个硬币能凑出来, 在这个基础上添加一个面值 3 元的硬币, 就得到了 11 元。
// // 使用若干个面值分别为 values[0..length] 的硬币 (可以重复, 并且 values[] 从小到大排序外币), // 凑齐 Sum 元, 最少需要多少个硬币. void find_least_coins(const int values[], const int length, const int Sum) {int * coins_count = new int[Sum + 1]; // coins_count[Sum] 表示, Sum 元可以用 coins_count[Sum] 个硬币凑出来.int * coins_trace = new int[Sum + 1]; // coins_trace[Sum] 表示, 在 coins_trace[Sum] 的基础上, 加上一个硬币, 凑齐了Sum元.// eg: coins_trace[11] = 6, 表示在 6 元的基础上增加了一个硬币凑到了 11 元.// eg: coins_trace[5] = 0, 表示在 0 元的基础上增加了一个硬币凑到了 5 元, 即直接使用面值 5 元的硬币.for (int i = 0; i < values[0]; i++) // 不能凑出比硬币最小面值还小的数额. {coins_count[i] = 0;coins_trace[i] = -1; // 表示无意义. }for (int i = values[0]; i < Sum + 1; i++) // i 表示面额. {int min = i; // 最少使用硬币个数.int idx = 0;for (int j = 0; j < length; j++) // j 表示硬币面值数组的索引. {if (i == values[j]) // 面额 i 元可以用硬币 j 凑出, 则直接用硬币 j 搞定. {min = 1; // 表示最少使用 1 个硬币就搞定.idx = 0; // 不用借助其他硬币break;}else if (i > values[j]) // 面额 i 大于硬币 j 的面值 {if (min >= coins_count[i - values[j]] + 1){// eg : coins_count[11] = coins_count[8] + 1 (面值5的硬币)min = coins_count[i - values[j]] + 1;idx = i - values[j];}}}coins_count[i] = min;coins_trace[i] = idx;}//// 输出// 输出组成 Sum 的硬币的个数int count = coins_count[Sum];cout << "total : " << count << endl;// 输出组成 Sum 的硬币的面值int i = Sum;for (int c = 0; c < count; c++){cout << "coin[" << i - coins_trace[i] << "] ";i = coins_trace[i];}cout << endl; }void find_least_coins() {int values[] = { 1, 3, 5 };find_least_coins(values, 3, 11); }
转载于:https://www.cnblogs.com/happylong/p/4506042.html
有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?相关推荐
- 问题:如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?.md
问题 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? 动态规划的本质是将原问题分解为同性质的若干相同子结构,在求解最优值的过程中将子结构的最优值记录到一个表中以避免有时会有 ...
- 动态规划:如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?
<p>首先我们思考一个问题,如何用最少的硬币凑够i元(i<11)?为什么要这么问呢?两个原因:1.当我们遇到一个大问题时,总是习惯把问题的规模变小,这样便于分析讨论.2.这个规模变小 ...
- c语言用10元20元50元不超过50张,凑够1000元,输出所有换算方式
在 C 语言中,你可以使用循环和分支语句来枚举所有可能的换算方式. 示例代码如下: #include <stdio.h>int main() {int i, j, k;for (i = 0 ...
- 动态规划,存在1元,3元,5元硬币若干,使用最少硬币构成n元
题目描述:存在一元,三元,五元硬币若干,如何用最少的硬币凑够11元. 看到最少这个字眼,我们可以进行判断能否通过动态规划进行求解,经过分析可以发现我们可以把这个问题拆分成相等的子问题,因此是可以用动态 ...
- 假设市面上有4种面值 硬币,20元、10元、5元、1元。输入一个钱数,能够使用最少的硬币凑成这个钱数
假设市面上有4种面值 硬币,20元.10元.5元.1元.输入一个钱数,能够使用最少的硬币凑成这个钱数. 编程思想:先看看能取出来几个20元的,在看看剩下的钱能取出来几个10元的,以此类推再取五元和一元 ...
- 用10元,20元,50元三种币值的纸币凑出1000元,一共有多少种组合(C++实现)三种思路,两种实现
今天做了中金所的笔试题,被一道题卡住了.题目意思是: 用10元,20元,50元三种币值的纸币凑出1000元,一共有多少种组合? 当时一眼看上去分析了一下,以为是背包问题,类似于爬楼梯,于是直接带了爬楼 ...
- 男子每天都点11元的盖饭 餐馆老板终于发现了蹊跷
男子每天来餐馆只点一份11元的盖饭,是不是有些奇怪?沙坪坝沙杨路一家餐馆的老板终于发现了这里面的蹊跷. 餐馆发现账目不对 "自从发生这件事过后,我们就很注意了,真没想到有人会用这样的办法来骗 ...
- 10元权限gm游戏_游戏P图超能打!揭秘10年老本儿500元升级计划
Hello大家好呀~在之前的<你问我答>栏目中,我们曾向大家征集了有关十年笔记本修复的种种问题.今天,我们特意请来了首席生活家@VitaminC爱摄影 为我们解答热心值友的问题,另外他还带 ...
- 【深度学习看手相】台湾学生获奖 AI 项目是科学还是伪科学? 搜狐科技 08-06 12:44 1新智元报道 来源: medium,facebook 编译:胡祥杰 张易 【新智元导读】本周日带来一个有
[深度学习看手相]台湾学生获奖 AI 项目是科学还是伪科学? 搜狐科技 08-06 12:44 1新智元报道 来源: medium,facebook 编译:胡祥杰 张易 [新智元导读]本周日带来一个有 ...
- 收费最低的云存储_百度云:虚拟主机11元/6个月,入门级云服务器60元/年
双11后热度持续,百度云适合于个人兴趣建站的云虚拟主机BCH,最低仅11元/6个月.想要入手云服务器的用户可以关注下. 抢购地址:https://t.cn/Ai1F64X1(可复制到浏览器打开) 百度 ...
最新文章
- ffmpeg text relocations
- Linux环境下服务器 Tomcat war包部署步骤
- 【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API
- 黑苹果小兵clover目录及驱动介绍
- 【Excel】字符串截取、去重复行
- 一、阿里矢量图标(字体图标)
- python中pip的使用 安装 升级 卸载包
- 任正非女儿孟晚舟成华为轮值董事长 公司年利润1137亿
- com.monotype.android.font.ktoppo,Zawgyi Myanmar Fonts Free
- CentOS最新版本与历史版本下载
- JS实现元素自动移动
- 达内python怎么样_在达内学Python怎么样?我能学会吗?
- 一行文字两端的均匀分布
- 四轮独立驱动电动汽车转矩分配控制 CarSim与Simulink联合 三自由度车辆模型(纵向、横向、横摆)
- 10分钟搞定 SpringBoot 如何优雅读取配置文件?
- stata常用命令汇总——自用备查
- Android情景模式控制
- SpringBoot-Jacoco单元测试覆盖率报告
- C++ 实现端口扫描(转载)
- postgreSQL 创建分区实践