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

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

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

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. 批量创建用户和设置密码
  2. Dockerfile 简版大全,附赠编写实例
  3. 《R语言初学指南》一2.3 找到R脚本中的错误
  4. crt mysql中文乱码_CRT 和mysql 中文乱码解决方式
  5. VS 2010的一些常用问题
  6. java parseint()
  7. zabbix自动发现redis端口并监控redis性能
  8. WinForms和XNA
  9. Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)...
  10. android imei *#06#,[Android]Hot key IMEI *#06# and *#07#
  11. javascript小技巧:同步服务器时间、同步倒计时
  12. Java实现PC端支付宝网页支付
  13. 计算机术语alu,计算机术语大全
  14. 惊悚游戏《寂静岭》厕所3D场景模型制作分享
  15. PHP简单的学生管理系统的代码
  16. JavaScript 图表LightningChart完整指南
  17. MikTex中如何使用BibTeX添加参考文献
  18. SAP中会计凭证数据表关系的简单验证
  19. oracle中sql查询增加自增序列号
  20. 人工湖对环境温度的调节问题

热门文章

  1. 【GCN-CTR】端到端的GNN-CTR:Dual Graph enhanced Embedding Neural Network for CTR Prediction (KDD‘21)
  2. word大括号中公式左对齐
  3. 【Xcelsius】在PPT中嵌入水晶易表Xcelsius2008仪表盘
  4. 此网站的安全证书有问题
  5. C++中优先队列priority_queue的基础用法
  6. 测试结果OK、POK、NG、NT的意义
  7. Hadoop名词解释
  8. [02/Dec/2019:12:59:10 +0800]之日期转换
  9. 信捷用c语言编写梯形图,PLC一键启停编程梯形图实例
  10. HotFix方案原理