解题思路:
第n年的母牛的来源分别来自于前一年剩下的和往前推3年的母牛(能生的母牛,最早的也算在里面)
第一年 | 第二年 | 第三年 | 第四年 | 第五年 | 第六年 |
1 | 2 | 3 | 4 | 4(第四年)+2(第二年)=6 f(5-1) + f(5-3) = 6 f(4) + f(2) = 6 | 6(第五年)+3(第三年)=9 f(6-1) + f(6-3) = 9 f(5) + f(3) = 9 |
6 = 前一年剩下的4头牛+(第2年新产的母牛刚具有生育能力生下的1头+最早的母牛1头)
解题公式:f(n) = f(n-1) + f(n-3)
注意事项:
解法1 递归
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(true){ int n = sc.nextInt(); if(n==0)break; System.out.println(f(n)); } } public static int f(int n){ //前四天没有母牛出生 if(n<=4){ return n; } //上一天出生数加前三天的出生数 return f(n-1)+f(n-3); } }
解法2 记忆型递归+剪枝 避免计算重复子问题
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(true){ int n = sc.nextInt(); if(n==0)break; System.out.println(f(n)); } } public static Integer[] arr = new Integer[999]; public static int f(int n){ //前四天没有母牛出生 if(n<=4){ arr[n]=n; return n; } //剪枝避免计算重复子问题 if(arr[n]!=null){ return arr[n]; } //记住存储结果 以便复用 arr[n]=f(n-1)+f(n-3); return arr[n]; } }
解法3 动态规划
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int [] arr = new int[999]; while(true){ int n = sc.nextInt(); if(n==0)break; for(int i = 1;i <= n;i++ ){ //前四天没有母牛出生 if(i<=4){ arr[i]=i; }else{ arr[i]=arr[i-1]+arr[i-3]; } } System.out.println(arr[n]); } } }
0.0分
187 人评分
#include<stdio.h> int main() { int a[56]={0,1,2,3,4,5}; int n; scanf("%d",&n); if(n>=5) { for(n=5;n++;n<55) { a[n]=a[n-1]+a[n-3]; } } printf("第%d年的母牛数是%d",n,a[n]); return 0; 这个为什么不对
#include <stdio.h> int main() { void mn(int n); int p; while(1){ scanf("%d",&p); if(p!=0){ mn(p); } else break; } return 0; } void mn(int n){ int x[3]={1,0,0} ; int a,b,c; a=n; for(b=1;b<=a-1;b++){ c=x[2]; x[2]=x[1]; x[1]=x[0]; x[0]=x[0]+c; } printf("%d\n",x[0]+x[1]+x[2]); //printf("%d%d%d\n",x[0],x[1],x[2]); return 0; }
#include<stdio.h> int fun(int); int main() { int n; while(scanf("%d",&n) && n) { printf("%d",fun(n)); } return 0; } int fun(int n) { if(n < 4) return n; if(n >= 4) { return fun(n - 1) + n - 3; } } 搞不懂了明明测试结果都一样,结果运行时间太长
黄小橘 2023-11-20 16:44:08 |
不是哥,怎么想出来的啊
dotcpp0748478 2024-04-08 21:05:26 |
#include <stdio.h> #include <stdlib.h> #define MAX_N 1000 // 假设输入的最大值不会超过这个数 int memo[MAX_N + 1]; // 用于存储已计算结果的数组 int fun(int n) { if (memo[n] != -1) { // 如果结果已经被计算过,则直接返回 return memo[n]; } if (n < 4) { memo[n] = n; // 存储结果 return n; } else { memo[n] = fun(n - 1) + fun(n - 3); // 递归计算并存储结果 return memo[n]; } } int main() { int n; // 初始化记忆化数组为-1,表示结果尚未计算 for (int i = 0; i <= MAX_N; ++i) { memo[i] = -1; } while (scanf("%d", &n) && n) { printf("%d\n", fun(n)); } return 0; }
#include <stdio.h> int count_cow (int n) { if (n == 1) return 1; if (n == 2) return 2; if (n == 3) return 3; if (n == 4) return 4; return count_cow(n - 1) + count_cow(n - 3); } int main() { int years; while(scanf("%d", &years) && years !=0) { printf("%d \n", count_cow(years)); } return 0; }
#include <stdio.h> int count_cow (int n) { if (n == 1) return 1; if (n == 2) return 2; if (n == 3) return 3; if (n == 4) return 4; return count_cow(n - 1) + count_cow(n - 3); } int main() { int years; while(scanf("%d", &years) && years !=0) { printf("%d \n", count_cow(years)); } return 0; }
#include<stdio.h> int main() { int num,b,y,p,n,a[6]={0,0,0,0},i; while(scanf("%d",&n)&&n!=0) { for (i=1;i<=4;i++) { a[i]=0; } i=1; num=1;//母牛数 b=1;//可生牛仔的母牛 for(y=1;y<=n-1;y++) { b=b+a[i]; num=num+b; a[i]=b; i++; if(i==4) i=1; } printf("%d\n",num); } return 0; } 终于写出来了,完全不知道啥是递归,硬凑^^
#include<stdio.h> int way(int n){ if(n<5){ return n; } else{ return way(n-1)+way(n-3); } } int main(){ int n=0; scanf("%d\n",&n); while(n!=0){ int count=way(n); printf("%d\n",count); scanf("%d\n",&n); } return 0; }
简单的a+b (C语言代码)浏览:583 |
不容易系列2 (C语言代码)浏览:641 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:484 |
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:539 |
简单的a+b (C语言代码)浏览:661 |
用筛法求之N内的素数。 (C语言代码)浏览:685 |
【计算直线的交点数】 (C语言代码)浏览:1501 |
C语言训练-亲密数 (C语言代码)浏览:697 |
DNA (C语言描述,蓝桥杯)浏览:1653 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:1100 |
莫提斯 2023-07-05 10:53:07 |
你的代码存在问题是因为你在for循环的判断条件和循环更新部分中都使用了变量 n。这样做会导致循环进入后 n 的值立即加一,直接跳过了初始值为5的情况,从而导致错误。另外,在最后输出的语句中,你使用了循环结束后的 n 值,这会超出数组范围。使用了另一个变量 i 作为循环索引,而不是使用 n。这样可以避免跳过初始值为5的情况。同时,在输出结果时,使用修正后的 n 值来获取对应年份的母牛数。#include <stdio.h> int main() { int a[56] = {0, 1, 2, 3, 4, 5}; int n; printf("请输入年份:"); scanf("%d", &n); if (n >= 5) { for (int i = 5; i <= n; i++) { a[i] = a[i - 1] + a[i - 3]; } } printf("第%d年的母牛数是%d ", n, a[n]); return 0; }
持言的yll 2023-07-27 14:18:04 |
@dotcpp0645582 谢谢谢谢,明白了