解题思路:
第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 人评分
int f[55]={1,2,3,4,6}; for(int i=5;i<55;i++) { f[i]=f[i-1]+f[i-3]; } int a[55]; for (int i=0;i<55;i++) { scanf("%d",&a[i]); if(a[i]==0)break; printf("%d\n",f[a[i]-1]); } return 0;
int main() { while(1){ int n,c; n = c = 0; scanf("%d", &n); for (int a = 0; a <= n; a++) { if (a > 4) { c += a - 4; } } n += c; if (n == 0) break; printf("%d\n", n); } return 0; } 为啥我这只对了一半,有没有大佬帮忙解决~~
小杜 2024-10-25 22:39:55 |
你本身算法就有问题,n>4后就是输出前两个的和然后再减去4, n<5式就输出n
小杜 2024-10-25 22:40:42 |
n==0直接弹出
编程者 2024-10-27 23:36:25 |
题目不是说n=0表示输入数据的结束,不做处理吗?所以这里的直接弹出啊。算法的话这样输入和输跟题目给的例子一样的。第五年后每次都是等差数列的增加。第五年增加一个,第六年增加两个~
编程者 2024-10-27 23:36:37 |
@dotcpp0805801 题目不是说n=0表示输入数据的结束,不做处理吗?所以这里的直接弹出啊。算法的话这样输入和输跟题目给的例子一样的。第五年后每次都是等差数列的增加。第五年增加一个,第六年增加两个~
#include<stdio.h> int main(){ int a; int b; while(1){ scanf("%d",&a); if(a<=3){ b=a; } else{ b=3+((1+a-3)*(a-3))/2; } printf("%d\n",b); } return 0; } 直接等差数列求和不是更简单
谁能告诉我为什么第八年为什么是13(第七年)+6?;不应该是5个成熟的加5吗,6是哪来的?求大佬
23物联网32李年念 2024-05-29 11:59:17 |
6是第五年的具有生产能力的牛
大神帮我看看这个为什么不行 Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int m=4; int y=1; if(n<=4) System.out.print(n); else{ for(int i=5;i<=n;i++){ y++; m+=y; } System.out.println(m); }
#include <stdio.h> #include <stdlib.h> int swap(int arr[],int n); int main() { int n,a,i; scanf("%d",&n); int *arr=malloc((n+1)*sizeof(int)); for(i=1;i<=4;i++) { arr[i-1]=i; } a=swap(arr,n); printf("%d",a); free(arr); return 0; } int swap(int arr[],int n) { if(n<=4) { return arr[n-1]; } else { return swap(arr,n-1)+swap(arr,n-3); } }
大神们能帮忙看下这样做为什么不行吗? #include<stdio.h> int main() { int n,sum=0; scanf("%d",&n); if(n<=4) sum=1+n-1;//四年前都是1头老母牛和n-1头小母牛 else sum=n-3+n-1;//四年后都是n-3头老母牛和n-1头小母牛 printf("%d",sum); }
#include<stdio.h> int main() { int year; scanf("%d",&year); //printf("%d \n",year); int b1,b2,b3; b2=b3=0; b3=1; int sum; sum=1; for (int i=2;i<=year;i++) { int m,n; m=n=0; m=b1; b1=b3; n=b2; b2=m; b3+=n; sum=b1+b2+b3; //printf("%d %d %d %d \n",b1,b2,b3,sum); } if(year==0) { } else { printf("%d",sum); } return 0; } 这样写正确吗
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:670 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:746 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:806 |
【矩阵】 (C++代码)浏览:999 |
字符逆序 (C语言代码)浏览:706 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:585 |
C语言程序设计教程(第三版)课后习题12.2 (C语言代码)浏览:839 |
简单的a+b (C语言代码)浏览:473 |
众数问题 (C语言代码)浏览:659 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:419 |