看到换零钱方式统计这里, 书中给出了递归的实现但没有给出迭代版本说要留给读者作为挑战, 既然说是作为挑战那肯定是能解决的,在想了一天无果之后最终在别人博客的帮助下终于实现了迭代的版本...也算是经历坎坷...下面是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 换零钱的迭代版本的更多相关文章

  1. DP优化与换零钱问题

    1 当贪心不再起效的时候 对于换零钱问题,最简单也是性能最好的方法就是贪心算法.可是贪心算法一定要满足面值相邻两个零钱至少为二倍关系的前提条件.例如1,2,5,10,20……这样的零钱组应用贪心最简单 ...

  2. STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort

    最近在看 侯捷的 STL源码分析,发现了以下的这个list 排序算法,乍眼看去,实在难以看出它是归并排序. 平常大家写归并排序,通常写的是 递归版本..为了效率的考虑,STL库 给出了如下的 归并排序 ...

  3. 小P的故事——神奇的换零钱&&人活着系列之平方数

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2777&cid=1219 这题不会,看了别人的代码 #include <iostre ...

  4. 子集和问题(应用--换零钱)POJ2229:Sumsets

    我一直在纠结换零钱这一类型的题目,今天好好絮叨一下,可以说他是背包的应用,也可以说他是单纯的dp.暂且称他为dp吧. 先上一道模板题目. sdut2777: 小P的故事——神奇的换零钱 题目描述 已知 ...

  5. SDUT3145:Integer division 1(换零钱背包)

    题目:传送门 题目描述 整数划分是一个非常经典的数学问题. 所谓整数划分,是指把一个正整数n写成为n=m1+m2+...+mi的形式,其中mi为正整数,并且1<=mi<=n,此时,{m1, ...

  6. 51nod 1101 换零钱 【完全背包变形/无限件可取】

    1101 换零钱  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...

  7. 51 Nod 1101 换零钱(动态规划好题)

    1101 换零钱  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 ...

  8. 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个 ...

  9. c++链表归并排序的迭代版本

    之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...

随机推荐

  1. json换行符的处理

    JS端的: var s = JSON.stringify(str); var ss = s.replace(/\\n/g, "\\n") .replace(/\\'/g, &quo ...

  2. Java-输入输出

    1. 流的分类 java.io 1.1 输入和输出流 File类不能访问文件内容本身,需要使用输入/输出流 输入输出流的方向是相对与内存读写的方向. 1.2 字节流和字符流 字节流 InputStea ...

  3. php时间日期处理

    php日期函数: 首先想到的就是date(),time(),strtotime(),mktime() strtotime() strtotime()函数用于将英文文本字符串表示的日期转换为时间戳,为 ...

  4. win8以管理员身份安装软件

    win8以管理员身份安装软件 msiexec /package

  5. golang的的模板引擎之pongo2

    https://github.com/flosch/pongo2 beego的扩展包 https://github.com/yansuan/beego-pongo2 gin的扩展包 https://g ...

  6. perl中的grep函数介绍

    grep函数 (如果你是个的新手,你可以先跳过下面的两段,直接到 Grep vs.loops 样例这一部分,放心,在后面你还会遇到它) <pre>grep BLOCK LISTgrep E ...

  7. activiti自定义流程之整合(四):整合自定义表单部署流程定义

    综合前几篇博文内容,我想在整合这一部分中应该会有很多模块会跳过不讲,就如自定义表单的表单列表那一块,因为这些模块在整合的过程中都几乎没有什么改动,再多讲也是重复无用功. 正因为如此,在创建了流程模型之 ...

  8. wordpress主题结构_源码

    WordPress博客主题的工作机制 WordPress主题由一系列模板文件组成,每个文件分别控制主题的特定区域.无论你处于哪个页面都能看到的网站的静态部分,由header文件.sidebar和foo ...

  9. SSH登录很慢问题的解决

    用ssh连其他linux机器,会等待10-30秒才有提示输入密码.严重影响工作效率.登录很慢,登录上去后速度正常,这种情况主要有两种可能的原因: 1. DNS反向解析的问题 OpenSSH在用户登录的 ...

  10. PKU 2406 Power Strings(KMP最长循环不重叠字串)

    题意:给一个字符串S长度不超过10^6,求最大的n使得S由n个相同的字符串a连接而成,如:"ababab"则由n=3个"ab"连接而成,"aaaa&q ...