• 两个有趣的算法问题


      (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2017年2月5日)

      一共是两道题,第一道是上学期的matlab考试的时候碰到的,另外一道是师弟发的一道数学题的学习笔记,于是找了个时间想了一下,结合网上找到的资料参考。用的是matlab语言。

    1.一只青蛙,每次可以选择跳1级或者跳2级,问跳n级一共有多少种方法?

      算法分析:  

      这道题当时我在考场上没有想出来,因为我没想到会考matlab实现算法的题目,问了一下编程组的同学,得到的答案是可以用二叉树,但是,至少目前我还没在matlab里面见过指针,C++的指针还不是很熟练(ps:现在熟练多了),于是只能换个思路了。

      从递归的角度去思考,关键还是怎么得到递推公式,首先跳1级只有1种方法,跳2级有2种方法,接着考虑以前做过的奥数题模型——蜗牛爬井,关键在于分析最后一天的情况,在这里我们也是分析最后几个台阶的情况。青蛙最后会在倒数第2级或者最后1级,因此接近递归出口时的方法是有$f(n-1)+f(n-2)$,换言之$f(n)=f(n-1)+f(n-2)$

    function answer=test(Number)
    if Number==1
        answer=1;
    elseif Number==2
        answer=2;
    else
        answer=test(Number-1)+test(Number-2);
    end
    

      

    2.M个相同的苹果放到N个相同的篮子中,问有多少种分法?

      算法分析:

      这里我参考了网上的资料,写出一个比较独特的递归方法。为了具体一点,这里我举8个苹果放到3个篮子里

      8个苹果3个篮子=8苹果2篮子+5个苹果2篮子+2苹果2篮子=(8苹果1篮子+6苹果1篮子)+(3苹果1篮子+1苹果1篮子)+(1苹果1篮子+1苹果1篮子)=5+3+2=10

      (2019年2月19日注:其实这个就是动态规划......)

    function answer=test(apple,basket)
    answer=0;
    if(basket<=1)
        answer=1;
        return;
    end
    for i=apple:-basket:0
        answer=answer+test(i,basket-1);
    end
    

      

  • 相关阅读:
    学习记录---KMP算法-部分匹配表理解
    关于GameObject无法禁用问题
    out用法
    关于Dictionary.TryGetValue的个人理解记录
    Transform.parent和Transform.root的区别
    Queue默认容量
    关于Camera Culling Mask
    MSVCP110.DLL没有被指定在WINDOWS上运行
    typeof instanceof 之间的区别总结
    Promise 使用心得
  • 原文地址:https://www.cnblogs.com/jcchan/p/10402280.html
Copyright © 2020-2023  润新知