1、猴子爬山問題:
問題:一個猴子在一座n級的山腳準備爬山,猴子上山一步可跳1級或3級,試問爬到第n階臺階,共有多少種不同的爬法?
//簡單遞推設計
這一問題實際上是一個整數有序可重複拆分的問題。試應用數組遞推求解,設爬k級臺階的不同爬法爲f(k)種。
探求f(k)的遞推關係
上山最後一步到達第30級臺階,完成上山,共有f(30)種不同的爬法,到第30級之前位於哪一級呢?無非就是位於第29級(上跳1級即可到),有f(29)種;或者位於第27級(上跳3級即可到),有f(27)種;於是f(30)=f(29)+f(27)
依次類推,有以下遞推關係:
f(k) = f(k-1)+f(k-3) (k>3)
//golang解法:
package main
import "fmt"
/*
猴子爬山
*/
func main() {
var n int
//n 大於2
fmt.Print("請輸入臺階總數n:")
_, err := fmt.Scan(&n)
if err != nil {
fmt.Println("error")
return
}
ways(n)
}
func ways(n int) {
f := make([]int, n)
f[0] = 1
f[1] = 1
f[2] = 2
for i:=3; i<n; i++{
f[i] = f[i-1] + f[i-3]
}
//請輸入臺階總數n:40
//共有2670964種不同的爬法
fmt.Printf("%d階樓梯共有的爬法數:%d",n, f[n-1])
}
2、8個乒乓球找出其中較重的一個:
你有8個一樣大小的球,其中7個的重量是一樣的,另一個比較重。怎樣能夠用天平僅稱兩次將那個重一些的球找出來。
解析:
爲了方便,我們將球編號爲:1,2,3,4,5,6,7,8,則我們的方案如下:
step 1 :將1,2,3放在天平左側,4,5,6放在天平右側,進行一次稱量,結果有兩種:
(1). 平衡,則重球在7,8中,稱量一次7和8即可獲得結果;
(2). 不平衡,假設1,2,3重,則拿出1和2稱量一次,假設平衡則3是重球,否則爲1,2中較重的球;
4,5,6重時和1,2,3重的處理方式相同;
3、小明一家過橋問題:
題目:小明一家過一座橋,過橋時是黑夜,所以必須有燈。現在小明過橋要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的媽媽要8秒,小明的爺爺要12秒。每次此橋最多可過兩人,而過橋的速度依過橋最慢者而定,而且燈在點燃後30秒就會熄滅。問:小明一家如何過橋?
答案:1、小明和小明弟弟過橋,需要花費3秒(小明弟弟慢,花3秒),計T1 = 3秒,總用時TC=3秒;
2、小明回來,需要花費1秒,記T2=1秒,總用時TC=4秒;
3、小明爺爺和小明媽媽一起過橋,需要花費12秒,記T3=12,總用時TC=16秒;
4、小明弟弟回來,需要花費3秒,記T4=3秒,總用時TC=19秒;
5、小明和小明爸爸一起過橋,需要花費6秒,記T5=6秒,總用時TC=25秒;
6、小明回來,需要花費1秒,記T6=1秒,總用時TC=26秒;
7、小明和小明弟弟一起過橋,需要花費3秒,記T7=3秒,總用時TC=29秒;
這樣,在第3步,小明爺爺和媽媽過橋後留下,第5步,小明爸爸過橋後留下,第7步,小明和小明弟弟過橋後,一家人成功在30秒內過橋。