• 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?


    输入

    输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
    n=0表示输入数据的结束,不做处理。

    输出

    对于每个测试实例,输出在第n年的时候母牛的数量。
    每个输出占一行。

    样例输入复制

    2
    4
    5
    0

    样例输出复制

    2
    4
    6

    代码如下:

    两种思路,递归和动态规划

    1,递归

    递归先考虑递归结束条件--》为当 n==1 的时候 只有一头牛,,return 1

    其他情况下:第n年 的牛的数量为:n-1年的数量和 今年新出生的牛的数量

    ,今年新出生的牛的数量 --就是在今年有生育能力的牛的数量--就是n-3年 时牛的数量

    所以又要讨论 n---当 n<=3的时候 有生育能力的牛只有一头,

    伪代码:

    if (n == 1)
        {
            return 1;
        }
         if (n <= 3)
        {
            return number(n - 1) + 1;
        }
        else
        {
            return number(n - 1) + number(n - 3);
        }

    这个代码没问题但是  容易超时

    我们继续考虑

    第一年 1头

    第二年 2头

    第三年 3头

    前三年来说都没有新的牛出生,且牛的头数和年份数相等

    改进:

     if (n <= 3)
        {
            return n;
        }
        else
        {
            return number(n - 1) + number(n - 3);
        }

    代码如下:

    1. #include<stdio.h>
    2. int number(int n)
    3. {
    4. /*if (n == 1)
    5. {
    6. return 1;
    7. }*/
    8. if (n <= 3)
    9. {
    10. //return number(n - 1) + 1;
    11. return n;
    12. }
    13. else
    14. {
    15. return number(n - 1) + number(n - 3);
    16. }
    17. }
    18. int main()
    19. {
    20. int arr[1000]={0};
    21. int n = 0;
    22. int i = 0;
    23. scanf("%d", &n);
    24. while (n != 0)
    25. {
    26. arr[i] = n;
    27. i++;
    28. scanf("%d", &n);
    29. }
    30. for (i = 0; arr[i] != '\0'; i++) {
    31. printf("%d\n", number(arr[i]));
    32. }
    33. return 0;
    34. }

     

    第二种方法:动态规划---就是找规律

    一样--这种比较抽象的题不要去 找 N年对应的牛的个数,,,这样会比较困难,,我们引入一个数组,,存放每年的牛的个数,横向找规律,,本质思路和递归同,

    代码如下:

    1. #include<stdio.h>
    2. int main()
    3. {
    4. int arr[1000]={0};
    5. int n = 0;
    6. int i = 1;
    7. scanf("%d", &n);
    8. int max = n;
    9. while (n != 0)
    10. {
    11. arr[i] = n;
    12. i++;
    13. if (n >= max)
    14. {
    15. max = n;
    16. }
    17. scanf("%d", &n);
    18. }
    19. int number[1000] = { 0 };//对应年份牛的个数
    20. for (i = 1; i <= max; i++)
    21. {
    22. if (i <= 3)
    23. {
    24. number[i] = i;
    25. }
    26. else
    27. {
    28. number[i] = number[i - 1] + number[i - 3];
    29. }
    30. }
    31. for (i = 1; arr[i] != '\0'; i++)
    32. {
    33. printf("%d\n", number[arr[i]]);
    34. }
    35. return 0;
    36. }

    来看看两个代码的速度(上面的是用 动态规划求解

     

    显然 -----动态规划  ----还是 要快呀

    快去用动态规划试试 斐波那契数列吧~!@#¥%……&*( 

  • 相关阅读:
    java:代理模式
    RHEL7同步ntp时间
    软件销售的话术(非常建议收藏)
    【STM32】LCD液晶显示
    [elementuiPlus]el-select改变时触发el-input校验的解决方法
    基于遗传算法和布谷鸟搜索优化算法的特征选择(Matlab代码实现)
    【网络】tcpdump、Wireshark 案例超详细介绍
    Docker实践经验:Docker 上部署 mysql8 主从复制
    (二)Linux三剑客-sed
    使用Ganache、web3.js和remix在私有链上部署并调用合约
  • 原文地址:https://blog.csdn.net/debug_h/article/details/125529967