SICP 换零钱的迭代版本
看到换零钱方式统计这里, 书中给出了递归的实现但没有给出迭代版本说要留给读者作为挑战, 既然说是作为挑战那肯定是能解决的,在想了一天无果之后最终在别人博客的帮助下终于实现了迭代的版本...也算是经历坎坷...下面是c语言的实现代码,参照的是这位大神的思路,饮水思源这里附上链接: http://www.jianshu.com/p/3e7477ab72de
C代码如下(匆忙实现没有注释很少,凑合着看) --> 过两天再改成scheme代码,今天懒得弄了...:
#include <stdio.h> int count = ;
int flag = ; // ---> 主要用来标注是在状态1还是状态2....(原文中的游标是右移动还是左移动) int cal(int a1, int a2, int a3, int a4, int a5);
void update(int total, int a1, int a2, int a3, int a4, int a5, int index);
void helper(int total, int a1, int a2, int a3, int a4, int a5, int index); void update(int total, int a1, int a2, int a3, int a4, int a5, int index){
if(flag){
if(index == ){
helper(total, a1-, a2+, a3, a4, a5, );
}else if(index == ){
helper(total, a1, a2-, a3+, a4, a5, );
}else if(index == ){
helper(total, a1, a2, a3-, a4+, a5, );
}else if(index == ){
helper(total, a1, a2, a3, a4-, a5+, );
}else{
flag = ;
count--;
helper(total, a1, a2, a3, a4, a5, );
}
}else{
flag = ;
if(a4 != ){
helper(total, a1, a2, a3, a4-, a5+, );
}else if(a3 != ){
helper(total, a1, a2, a3-, a4+, , );
}else if(a2 != ){
helper(total, a1, a2-, a3+, , , );
}else if(a1 != ){
helper(total, a1-, a2+, , , , );
}else{
helper(total, a1, a2, a3, a4, a5+, );
}
}
} int cal(int a1, int a2, int a3, int a4, int a5){
return * a1 + * a2 + * a3 + * a4 + a5;
} void helper(int total, int a1, int a2, int a3, int a4, int a5, int index){
if(a1 == && a2 == && a3 == && a4 == && cal(a1, a2, a3, a4, a5) > total){
return;
} else{
if(cal(a1, a2, a3, a4, a5) == total){
count++;
update(total, a1, a2, a3, a4, a5, index);
} else if(cal(a1, a2, a3, a4, a5) < total){
if(index == ){
helper(total, a1+, a2, a3, a4, a5, );
}else if(index == ){
helper(total, a1, a2+, a3, a4, a5, );
}else if(index == ){
helper(total, a1, a2, a3+, a4, a5, );
}else if(index == ){
helper(total, a1, a2, a3, a4+, a5, );
}else{
helper(total, a1, a2, a3, a4, a5+, );
}
}else{
update(total, a1, a2, a3, a4, a5, index);
}
}
} int main(void){
int n = ;
helper(n, , , , , , );
printf("%d\n", count);
}
SICP 换零钱的迭代版本的更多相关文章
- DP优化与换零钱问题
1 当贪心不再起效的时候 对于换零钱问题,最简单也是性能最好的方法就是贪心算法.可是贪心算法一定要满足面值相邻两个零钱至少为二倍关系的前提条件.例如1,2,5,10,20……这样的零钱组应用贪心最简单 ...
- STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort
最近在看 侯捷的 STL源码分析,发现了以下的这个list 排序算法,乍眼看去,实在难以看出它是归并排序. 平常大家写归并排序,通常写的是 递归版本..为了效率的考虑,STL库 给出了如下的 归并排序 ...
- 小P的故事——神奇的换零钱&&人活着系列之平方数
http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2777&cid=1219 这题不会,看了别人的代码 #include <iostre ...
- 子集和问题(应用--换零钱)POJ2229:Sumsets
我一直在纠结换零钱这一类型的题目,今天好好絮叨一下,可以说他是背包的应用,也可以说他是单纯的dp.暂且称他为dp吧. 先上一道模板题目. sdut2777: 小P的故事——神奇的换零钱 题目描述 已知 ...
- SDUT3145:Integer division 1(换零钱背包)
题目:传送门 题目描述 整数划分是一个非常经典的数学问题. 所谓整数划分,是指把一个正整数n写成为n=m1+m2+...+mi的形式,其中mi为正整数,并且1<=mi<=n,此时,{m1, ...
- 51nod 1101 换零钱 【完全背包变形/无限件可取】
1101 换零钱 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...
- 51 Nod 1101 换零钱(动态规划好题)
1101 换零钱 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...
- 51nod 1101换零钱(背包)
N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元. 例如:5分钱换为零钱,有以下4种换法: 1.5个1分 2.1个2分3个1分 3.2个 ...
- c++链表归并排序的迭代版本
之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...
随机推荐
- Neutron分析(2)——neutron-server启动过程分析
neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...
- 【多线程】Future和FutureTask以及CompletionService
Future接口 此接口主要用于: 代表异步计算的执行结果: 用于可取消的task:(比使用interrupt实现取消要方便 ) FutureTask类 FutureTask是Future的一个实现类 ...
- android学习笔记20——ProgressDialog进度条对话框
ProgressDialog==>进度条对话框 ProgressDialog本身就代表一个进度条对话框,程序只需要创建ProgressDialog实例,并将其显示出来就是一个进度条对话框:开发者 ...
- (WPF, MVVM) Event 处理
WPF的有些UI元素有Command属性可以直接实现绑定,如Button 但是很多Event的触发如何绑定到ViewModel中的Command呢? 答案就是使用EventTrigger可以实现. 继 ...
- Software Engineer
1, 软件工程师 软件工程师英文是Software Engineer,是从事软件职业的人员的一种职业能力的认证,通过它说明具备了工程师的资格.软件工程师是从事软件开发相关工作的人员的统称. 它是一个广 ...
- ylbtech-LanguageSamples-Unsafe(不安全代码)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Unsafe(不安全代码) 1.A,示例(Sample) 返回顶部 “不安全代码”示例 ...
- JAVA 界面 - 记事本
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Jiemian10 extends ...
- jsLint配置参数解释
转自: http://www.cnblogs.com/elementstorm/archive/2013/04/10/3012679.htmlanon :true //匿名函数声明中function关 ...
- 理解perl的编码转换——utf8以及乱码
工作需要,闲暇之余,仔细研究了一下脚本乱码的问题 1. vim新建的文件 1)在linux命令行 vim命令建立的文件,如果内容中不出现中文,默认是ASCII.那么用notepad++打开的时候,就是 ...
- JAVA中抽象类的一些总结
抽象类和普通类一样,有构造函数.抽象类中有一些属性,可以利用构造方法对属性进行初始化.子类对象实例化的时候先执行抽象类的构造,再执行子类构造. 抽象类不能用final声明.因为抽象类必须有子类继承,所 ...