zoukankan      html  css  js  c++  java
  • SICP 换零钱的迭代版本

    看到换零钱方式统计这里, 书中给出了递归的实现但没有给出迭代版本说要留给读者作为挑战, 既然说是作为挑战那肯定是能解决的,在想了一天无果之后最终在别人博客的帮助下终于实现了迭代的版本...也算是经历坎坷...下面是c语言的实现代码,参照的是这位大神的思路,饮水思源这里附上链接: http://www.jianshu.com/p/3e7477ab72de

    C代码如下(匆忙实现没有注释很少,凑合着看) --> 过两天再改成scheme代码,今天懒得弄了...:


     1 #include <stdio.h>
     2 
     3 int count = 0;
     4 int flag = 1; // ---> 主要用来标注是在状态1还是状态2....(原文中的游标是右移动还是左移动)
     5 
     6 int cal(int a1, int a2, int a3, int a4, int a5);
     7 void update(int total, int a1, int a2, int a3, int a4, int a5, int index);
     8 void helper(int total, int a1, int a2, int a3, int a4, int a5, int index);
     9 
    10 
    11 void update(int total, int a1, int a2, int a3, int a4, int a5, int index){
    12   if(flag){
    13     if(index == 0){
    14       helper(total, a1-1, a2+1, a3, a4, a5, 1);
    15     }else if(index == 1){
    16       helper(total, a1, a2-1, a3+1, a4, a5, 2);
    17     }else if(index == 2){
    18       helper(total, a1, a2, a3-1, a4+1, a5, 3);
    19     }else if(index == 3){
    20       helper(total, a1, a2, a3, a4-1, a5+1, 4);
    21     }else{
    22       flag = 0;
    23       count--;
    24       helper(total, a1, a2, a3, a4, a5, 4);
    25     }
    26   }else{
    27     flag = 1;
    28     if(a4 != 0){
    29       helper(total, a1, a2, a3, a4-1, a5+1, 4);
    30     }else if(a3 != 0){
    31       helper(total, a1, a2, a3-1, a4+1, 0, 3);
    32     }else if(a2 != 0){
    33       helper(total, a1, a2-1, a3+1, 0, 0, 2);
    34     }else if(a1 != 0){
    35       helper(total, a1-1, a2+1, 0, 0, 0, 1);
    36     }else{
    37       helper(total, a1, a2, a3, a4, a5+1, 0);
    38     }
    39   }
    40 }
    41 
    42 int cal(int a1, int a2, int a3, int a4, int a5){
    43   return 50 * a1 + 25 * a2 + 10 * a3 + 5 * a4 + a5;
    44 }
    45 
    46 void helper(int total, int a1, int a2, int a3, int a4, int a5, int index){
    47   if(a1 == 0 && a2 == 0 && a3 == 0 && a4 == 0 && cal(a1, a2, a3, a4, a5) > total){
    48     return;
    49   } else{
    50     if(cal(a1, a2, a3, a4, a5) == total){
    51       count++;
    52       update(total, a1, a2, a3, a4, a5, index);
    53     } else if(cal(a1, a2, a3, a4, a5) < total){
    54       if(index == 0){
    55         helper(total, a1+1, a2, a3, a4, a5, 0);
    56       }else if(index == 1){
    57         helper(total, a1, a2+1, a3, a4, a5, 1);
    58       }else if(index == 2){
    59         helper(total, a1, a2, a3+1, a4, a5, 2);
    60       }else if(index == 3){
    61         helper(total, a1, a2, a3, a4+1, a5, 3);
    62       }else{
    63         helper(total, a1, a2, a3, a4, a5+1, 4);
    64       }
    65     }else{
    66       update(total, a1, a2, a3, a4, a5, index);
    67     }
    68   }
    69 }
    70 
    71 
    72 int main(void){
    73   int n = 100;
    74   helper(n, 0, 0, 0, 0, 0, 0);
    75   printf("%d
    ", count);
    76 }




  • 相关阅读:
    03_02_leetcode_24_删除有序数组的重复项
    03_02_leetcode_141_环形链表
    03_02_leetcode_24_两两交换链表中的结点
    Solution -「ZJOI 2014」力
    Solution -「GXOI / GZOI 2019」宝牌一大堆
    Solution -「CSP 2019」Centroid
    Solution -「CSP 2019」Partition
    Note -「Suffix Automaton」SAM
    Solution -「BalticOI 2004」Sequence
    Solution -「BZOJ 3779」重组病毒
  • 原文地址:https://www.cnblogs.com/nzhl/p/5450379.html
Copyright © 2011-2022 走看看