给定不同面额的硬币和一个总金额,计算出组成该总金额的所需硬币的最小个数。

好久没有刷算法题了,最近被问到这么个问题,有点懵逼,连个动态规划的状态转移方程都写不出来了。实在是惭愧。决定没事的时候,刷一些动态规划的东西。

网上有很多教程,直接写下状态转移方程:

F(N) = Min{ F(N-k), k in coins } + 1, 其中coins是给定不同面额的硬币的集合。

递归实现比较简单,直接根据状态方程写即可。但是递归的时候,栈是有限制的,计算出来的N比较有限。所以最好改成循环实现。
这里用了一种类似广搜的方法(在深入的研究中发现广搜这个方法实在是太笨了,效率很差,请不要学习,完全只需要一个记录表即可),计算N的值。(懒得写list了,直接用c++的queue)。大致的非优雅代码如下:

#include <stdio.h>
#include <queue>int coins[] = {1, 7, 11};#define MAX 10000
int ret[MAX] = {0};#define min(a, b)  (a) < (b) ? (a) : (b)int getN(int n, int size)
{// 只计算小于MAX的if(n >= MAX)return 0;// 初始化ret和queuestd::queue<int> q;for(int i = 0; i < size; i ++){ret[coins[i]] = 1;q.push(coins[i]);}   int f, t;while(q.size() > 0){// 遍历queue中的每个元素,与coins结合,并把新的结果放到queue中int f = q.front();for(int i = 0;i < size; i ++){t = f + coins[i];    // 新的结果if(t < MAX && t <= n)  // 新的结果小于MAX,且不大于目标结果N{if(ret[t] == 0)    // 第一个组成金额t的硬币个数ret[t] = ret[f] + 1;else               // 第二次以及之后组成金币t的硬币个数,必须小于之前存的结果才替换。ret[t] = min(ret[t], ret[f]+1);q.push(t);       // 新的结果放到queue之后,等待广搜}}q.pop();            // 把已经匹配的路径去掉}return ret[n];         // 返回期望值
}int main()
{int size = sizeof(coins)/sizeof(int);int ret = getN(14, size);printf("%d\n", ret);return 0;
}

硬币组合问题-非递归实现相关推荐

  1. 【算法趣题】硬币组合

    题目描述: 当下,坐公交或者地铁时大部分人都是刷卡的.不过,时至今日还在用现金支付的人还是比想象的多.本题我们以安置在公交上的零钱兑换机为背景.这个机器可以用纸币兑换到 10 日元.50 日元.100 ...

  2. 深度优先搜索(DFS)递归形式改为非递归形式

    DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...

  3. 优惠券使用/凑满减优惠/硬币组合问题(结果包括最优组合和最优值)

    DP法求满减优惠组合问题 一.原问题描述 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别 ...

  4. 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt

    <王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...

  5. 组合数算法的非递归实现

    问题描述 前段时间有位新员工同事遇到了对象组合问题,使用递归的方式实现,在代码审阅的过程中发现,该方法在实现上存在业务逻辑与算法逻辑耦合度过高.使用不便于调试的非尾递归等问题,而数组元素组合在我们开发 ...

  6. leetcode 77. Combinations-排列|递归|非递归|Java|Python

    原题链接:77. Combinations [思路-Java.Python]递归实现 采用回溯算法.这是一道 NP 难问题,时间复杂度没办法提高,用一个循环递归处理子问题,问题的终止条件是每个组合中的 ...

  7. 递归算法之10硬币组合一角8分

    <递归算法>10个硬币组合一角八分** 题目解析:硬币都有1,2,5分的,如果以分为单位,也就是说1,2,5,这三个数和值为18且正好是10个数相加. 定义两个容器 temp为 一个零时存 ...

  8. 有多少种硬币组合,更优解法

    写在前面的自我检讨 v2 上周我发布了一篇博文有多少种硬币组合--找出独特子数组之和,是关于有多少种硬币组合的算法题的解法.虽然算法本身能够给出一个正确答案,可是仔细想来,我却没办法给出一个简单直接的 ...

  9. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法

    python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...

  10. 快速排序的递归和非递归实现 c语言版本

    代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...

最新文章

  1. STM32中断优先级和开关总中断(很老很经典)
  2. SAP服务器性能管理常用的功能解析
  3. 从缓冲上看阻塞与非阻塞socket在发送接收上的区别(转载)
  4. 牛客题霸 [ 岛屿数量] C++题解/答案
  5. 科目三-变更车道,直线行驶和超车的考试标准
  6. scrapyd部署_如何通过 Scrapyd + ScrapydWeb 简单高效地部署和监控分布式爬虫项目
  7. 白话说编程之java线程
  8. Python2.7.16安装(Win10)
  9. 计算机维修七方法,七种常用方案解决电脑没声音故障
  10. Codeforces #105 DIV2 ABCDE
  11. vscode 网页版
  12. java 读取内存地址结构体_Java并发系列之volatile
  13. 【JSTL】<c:if test=“”>没有else的解决方法
  14. C语言程序设计(第五版)-谭浩强著-课后习题
  15. php版的求表达式的真值表-TrueValueTable
  16. OPCUA协议: 复杂服务器C语言初步实践(回调与方法)
  17. 表空间的空间管理算法
  18. 苹果x跟xr哪个好_苹果XR和苹果X哪个性价比高
  19. 《他乡的童年》观后感——英国教育
  20. 利用计算机诊断ct故障,皮克I/Q CT计算机电源故障修理

热门文章

  1. Supermicro 1024US-TRT 服务器评测:1U 机箱中的 128 个内核
  2. lbp2900打印机linux驱动下载,佳能LBP2900+驱动下载-佳能LBP2900+打印机驱动下载 V3.30官方版--pc6下载站...
  3. 中国176个AAAAA级景区,存起来吧!下一站你去哪里?
  4. 线上CPU飙高问题排查 (Java)
  5. 病房计算机管理制度,全套协和医院管理制度大全【148个文件】
  6. 读《天才在左,疯子在右》03--灵魂深处
  7. java霸王别姬游戏_霸王别姬_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
  8. 国外LEAD赚钱提现到WMZ,附赚钱项目
  9. OpenSSL密码库算法笔记——第4章 模指数运算
  10. ajax异步提示对号,jQuery Ajax显示对号和错号用于验证输入验证码是否正确