问题:一个农夫养了一头牛,三年后,这头牛每年会生出一头牛,生出来的牛三年后又可以每年生出一头牛....问农夫10年后有多少头牛,n年呢?
算法一:
package com.test;
public class AlgorithmOne {
/**
* 动态规划算法
* @param args
* 数组num中存储的是新生的牛的数目,这里的新生表示除了最开始的一头牛外的所有其他牛
* 例如:num[3]表示到第3年来新生的牛的数目
* num[i] = num[i-1]+num[i-3]+1;
* 上面的式子表示:第i年的新牛数目为第i-1年的新牛数目加上第i-3年的新牛数目(因为第i-3年的牛仔第i年就会生小牛了),
* 再加上最开始的那头牛在第i年也会生出一头牛
*/
public static void main(String[] args) {
final int size = 100;
long [] num = new long[size+1];
num[0]=num[1]=num[2]=0;
for(int i =3;i<=size;i++){
num[i] = num[i-1]+num[i-3]+1;
System.out.println("第"+i+"年,牛的数量:"+(num[i]+1));
}
}
}
算法二:
package com.bean;
public class Cow {
private int age = 0;
public void addAge(){
age++;
}
public boolean isCreatCrow(){
return (age>=3)? true:false;
}
}
package com.test;
import java.util.ArrayList;
import java.util.List;
import com.bean.Cow;
public class AlgorithmTwo {
public static void main(String[] args) {
List<Cow> cowList = new ArrayList<Cow>();
cowList.add(new Cow());
int yearCount = 10;
for(int i =1;i<=yearCount;i++){
int cowNum = cowList.size();
for(int j=0;j<cowNum;j++){
Cow cow = cowList.get(j);
cow.addAge();
if(cow.isCreatCrow()){
cowList.add(new Cow());
}
}
}
System.out.println(yearCount+"年后将有"+cowList.size()+"头牛");
}
}
算法三:
package com.test;
public class AlgorthmThree {
static int count = 1;
private static void feedCow(int year,int age){
year++;
age++;
if(year<=10){
if(age>=3){
count ++;
feedCow(year, 0);
}
feedCow(year, age);
}
}
public static void main(String[] args) {
new AlgorthmThree().feedCow(0, 0);
System.out.println(count);
}
}
算法四:
package com.bean;
public class CowBean {
public static int count = 0;
/**
* 算法核心:该算法计算每头牛包括其后代在这10年内能生了多少小牛
* @param year
* 每new一次CowBean就会执行count++
*/
public CowBean(int year){
count ++;
for(int i =3+year;i<=10;i++){
new CowBean(i);
}
}
public static void main(String[] args) {
new CowBean(0);
System.out.println(count);
}
}
转载连接:
http://hechuanzhen.iteye.com/blog/1845173