实验四:使用分治算法解决母牛的故事
一、实验目的
练习使用分治算法解决实际问题(使用Java语言实现)。
二、实验内容
【问题描述】
有一头母牛,它从第二年开始每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
【输入】
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。n=0表示输入数据的结束,不做处理。
【输出】
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
【样例输入】
2
4
5
0
【样例输出】
2
4
6
三、主要思路
每只小牛会在第四年开始生小牛,所以第n年牛的总数为第n-1年的牛的数加上第n-3年牛的数量。由此可得递推式 f ( n ) = f ( n − 1 ) + f ( n − 3 ) f(n)=f(n-1)+f(n-3) f(n)=f(n−1)+f(n−3)
为了避免重复计算,使用一个数组存放之前计算过的结果,并将年数记为count。如果需要求的n<=count,则直接从数组中获取结果;如果n>count,则使用递推式计算结果,并将结果存入数组中。
四、程序代码
Cow.java
package Cows;
import java.util.Scanner;
public class Cow {
private int cowNums[] =new int[56];
private int count;
Cow(){
cowNums[1]=1;
cowNums[2]=2;
cowNums[3]=3;
this.count=3;
}
public void totalFunciton(){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
while(n!=0){
int res=solve(n);
output(res);
n=sc.nextInt();
}
}
public int solve(int n){
if(n<=count){
return cowNums[n];
}
else {
while (n > count) {
count++;
cowNums[count] = cowNums[count - 1] + cowNums[count - 3];
}
return cowNums[n];
}
}
public void output(int n){
System.out.println(n);
}
}
Test.java
package Cows;
public class Test {
public static void main(String[] args) {
Cow cow=new Cow();
cow.totalFunciton();
}
}
五、运行结果