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++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...
随机推荐
- WPF--Calendar控件高级使用
一.得到当前显示的月份: DateTime SelectedDay = this.MC.DisplayDate; 二.得到当前选中的天,得到当前选中的周,得到当前显示的月份: 如果你使用系统默认的事件 ...
- (转)jQuery禁止右键菜单,全选
本文转载自:http://www.cnblogs.com/lucker/archive/2012/09/21/2696464.html $("body").bind("c ...
- IOS中UIWebView停止加载
方法一: [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank" ...
- 我的Android最佳实践之—— 解决闪空界面问题
进入应用时,由于应用的启动Activity都会有默认的theme,所以会跳一下原始界面,才启动我们定义的theme. 修改这个问题的方法,就是给应用启动的Activity设置一个空的theme.如下面 ...
- scala高级内容(二) - Implicit
一. Implicit关键字 隐士转换 (1)隐士转换函数:用implicit修饰的,只有一个参数的函数.他会被自动执行,来把一个值转换成另一个 class RichFile(val f:File){ ...
- unity客户端与c++服务器之间的简单通讯_1
// 服务器 # pragma once using namespace std; # include <iostream> # include <string> # incl ...
- shell 的语法
SHELL 的语法 n 变量:字符串,数字,环境和参数 n 条件:shell中的布尔值 n 程序控制:if, elif, for, while until, case n 命令列表 n 函数 ...
- 文件 FIFO队列
<?php /** * Filefifo.php 文件型FIFO队列 */ class Filefifo { /** * $_file_data, 数据文件的路径 */ private $_fi ...
- Android 区别普通Touch方法和Scroll
今天想实现这个功能,但只是利用现有的onTouchEvent和GestureDetector感觉做起来有些纠结,原来好像也尝试过,最后搞的程序有点乱,不好维护,那么就利用一下Android程序员最大的 ...
- vs2015-Azure Mobile Service
/App_Data /App_Start/ WebApiConfig.cs using System; using System.Collections.Generic; using System.C ...