硬币组合问题-非递归实现
给定不同面额的硬币和一个总金额,计算出组成该总金额的所需硬币的最小个数。
好久没有刷算法题了,最近被问到这么个问题,有点懵逼,连个动态规划的状态转移方程都写不出来了。实在是惭愧。决定没事的时候,刷一些动态规划的东西。
网上有很多教程,直接写下状态转移方程:
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;
}
硬币组合问题-非递归实现相关推荐
- 【算法趣题】硬币组合
题目描述: 当下,坐公交或者地铁时大部分人都是刷卡的.不过,时至今日还在用现金支付的人还是比想象的多.本题我们以安置在公交上的零钱兑换机为背景.这个机器可以用纸币兑换到 10 日元.50 日元.100 ...
- 深度优先搜索(DFS)递归形式改为非递归形式
DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...
- 优惠券使用/凑满减优惠/硬币组合问题(结果包括最优组合和最优值)
DP法求满减优惠组合问题 一.原问题描述 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别 ...
- 循环赛日程表非递归Java_王晓东《算法设计与分析》课件.ppt
<王晓东<算法设计与分析>课件.ppt>由会员分享,可在线阅读,更多相关<王晓东<算法设计与分析>课件.ppt(356页珍藏版)>请在人人文库网上搜索. ...
- 组合数算法的非递归实现
问题描述 前段时间有位新员工同事遇到了对象组合问题,使用递归的方式实现,在代码审阅的过程中发现,该方法在实现上存在业务逻辑与算法逻辑耦合度过高.使用不便于调试的非尾递归等问题,而数组元素组合在我们开发 ...
- leetcode 77. Combinations-排列|递归|非递归|Java|Python
原题链接:77. Combinations [思路-Java.Python]递归实现 采用回溯算法.这是一道 NP 难问题,时间复杂度没办法提高,用一个循环递归处理子问题,问题的终止条件是每个组合中的 ...
- 递归算法之10硬币组合一角8分
<递归算法>10个硬币组合一角八分** 题目解析:硬币都有1,2,5分的,如果以分为单位,也就是说1,2,5,这三个数和值为18且正好是10个数相加. 定义两个容器 temp为 一个零时存 ...
- 有多少种硬币组合,更优解法
写在前面的自我检讨 v2 上周我发布了一篇博文有多少种硬币组合--找出独特子数组之和,是关于有多少种硬币组合的算法题的解法.虽然算法本身能够给出一个正确答案,可是仔细想来,我却没办法给出一个简单直接的 ...
- 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法
python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...
- 快速排序的递归和非递归实现 c语言版本
代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...
最新文章
- 批量创建用户和设置密码
- Dockerfile 简版大全,附赠编写实例
- 《R语言初学指南》一2.3 找到R脚本中的错误
- crt mysql中文乱码_CRT 和mysql 中文乱码解决方式
- VS 2010的一些常用问题
- java parseint()
- zabbix自动发现redis端口并监控redis性能
- WinForms和XNA
- Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)...
- android imei *#06#,[Android]Hot key IMEI *#06# and *#07#
- javascript小技巧:同步服务器时间、同步倒计时
- Java实现PC端支付宝网页支付
- 计算机术语alu,计算机术语大全
- 惊悚游戏《寂静岭》厕所3D场景模型制作分享
- PHP简单的学生管理系统的代码
- JavaScript 图表LightningChart完整指南
- MikTex中如何使用BibTeX添加参考文献
- SAP中会计凭证数据表关系的简单验证
- oracle中sql查询增加自增序列号
- 人工湖对环境温度的调节问题
热门文章
- 【GCN-CTR】端到端的GNN-CTR:Dual Graph enhanced Embedding Neural Network for CTR Prediction (KDD‘21)
- word大括号中公式左对齐
- 【Xcelsius】在PPT中嵌入水晶易表Xcelsius2008仪表盘
- 此网站的安全证书有问题
- C++中优先队列priority_queue的基础用法
- 测试结果OK、POK、NG、NT的意义
- Hadoop名词解释
- [02/Dec/2019:12:59:10 +0800]之日期转换
- 信捷用c语言编写梯形图,PLC一键启停编程梯形图实例
- HotFix方案原理