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

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

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

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. Apache FileUpload介绍
  2. 交叉验证(Cross Validation)方法思想简介
  3. How to not show unnecessary zeros when given integers but still have float answers when needed
  4. 教你自己制作Vista与DOS双系统
  5. 怎样保护计算机连接线,一根网线把电脑烧了:雷雨天如何保护家电?
  6. 山东省中职信息技术c语言试题及答案,中职计算机专业C语言测试题
  7. 长在华人第一学霸家族的他,到底有多牛?
  8. 【mysql系列】细谈explain执行计划之“谜”
  9. 拳王虚拟项目公社:月入16000+的虚拟商品教程,虚拟项目全自动化的升级玩法拆解
  10. LLVM每日谈之三 如何创建一个LLVM工程
  11. Cocos2d-x 学习之引擎介绍
  12. 2019最新北风网Ant+Java全套视频课程
  13. scala下载新的版本号
  14. 计算机相关技术资料整理
  15. Google Hacker
  16. 【MODBUS通讯协议】
  17. 使用vim修改只读文件
  18. 宇宙飞船大战html5游戏,GitHub - WildDogTeam/demo-js-starwars: 基于WildDog的太空大战游戏...
  19. 阿里 P9 耗时 28 天,总结历年亿级活动高并发系统设计手册
  20. KNN算法说明以及sklearn 中 neighbors.KNeighborsClassifier参数说明

热门文章

  1. 计算机如何解锁 磁盘,怎么解除Dell电脑硬盘的bitlocker加密
  2. iPhone 屏幕适配尺寸整理
  3. BZOJ5294 BJOI2018 二进制 线段树
  4. 花瓣网 html,css+html如何仿花瓣网实现静态登陆页面?(代码实
  5. 物联网应用隐私保护技术
  6. 操作系统中的进程调度策略有哪几种
  7. 我要偷偷的学Python,然后惊呆所有人(第一天)
  8. 牛客寒假训练营1 K 冒险公社(线性dp)
  9. 【文献阅读】ERNIE: Enhanced Representation through Knowledge Integration
  10. [面试题]1000瓶毒药里面只有1瓶是有毒的,问需要多少只老鼠才能试出那瓶有毒。