龚秋志


私信TA

用户名:uq_48078956563

访问量:55045

签 名:

等  级
排  名 36
经  验 13973
参赛次数 30
文章发表 64
年  龄 19
在职情况 学生
学  校 湖北生物科技职业学院
专  业 计算机应用

  自我简介:

解题思路:

        第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;
2024-11-05 19:40:44
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-20 16:59:40
#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;
	}
	直接等差数列求和不是更简单
2024-07-12 17:46:44
谁能告诉我为什么第八年为什么是13(第七年)+6?;不应该是5个成熟的加5吗,6是哪来的?求大佬
2024-04-06 17:05:31
大神帮我看看这个为什么不行		


                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);
	}
2024-03-23 18:12:51
#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);
    }
}
2024-01-11 17:24:39
大神们能帮忙看下这样做为什么不行吗?
#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);
}
2023-12-02 15:02:21
#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;
}
这样写正确吗
2023-11-29 15:41:38