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++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...
随机推荐
- vs2012 遇到 “此操作要求使用 IIS 集成管线模式。”
这个项目是VS2013开发的,我用2012打开想调试,但报这个错误. 最后安装2013,然后调试则正常.
- phpstorm 配置自带webserver ,配置根目录
版权声明:本文为博主原创文章,未经博主允许不得转载. from http://blog.csdn.net/pony_maggie/article/details/52367093 目录(?)[-] ...
- bzoj3545: [ONTAK2010]Peaks
Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询 ...
- 【log】log4j
常用log4j.properties配置文件 log4j.rootLogger = info,console #指定serviceImpl层 日志输出 log4j.logger.com.sms.ser ...
- DatagridView 最后编辑状态数据无法自动提交的问题
DataGridView1.CurrentCell = null 从一个帖子上看的,绝招! http://bbs.csdn.net/topics/120020614
- ios8 ios7 tableview cell 分割线左对齐
ios8中左对齐代码 //加入如下代码 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cel ...
- Centos 7 修改SSH端口号
注意!这里的Centos版本是7 step1 修改/etc/ssh/sshd_config vi /etc/ssh/sshd_config #Port 22 //这行去掉#号 Po ...
- 转-android图片降低图片大小保持图片清晰的方法
http://i.cnblogs.com/EditPosts.aspx?opt=1 android里面对于图片的处理一直是个比较烦人的问题,烦人之处在于一个不小心,就有可能造成OOM. 最近碰到一个关 ...
- jQuery实现的美观的倒计时实例代码
<!DOCTYPE html><html><head><meta charset=" utf-8"><meta name=&q ...
- R中根据匹配原则将一列拆分为几列的方法
例如我们需要将一下数据的第二列从and处拆分为两列: before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar ...