問題描述
乙個樓梯有20級,每次走1級或兩級,請問從底走到頂一共有多少種走法?
分析:假設從底走到第n級的走法有f(n)種,走到第n級有兩個方法,乙個是從(n-1)級走一步,另乙個是從第(n-2)級走兩步,前者有f(n-1)種方法,後者有f(n-2)種方法,所以有f(n)=f(n-1)+f(n-2),還有f(0)=1,f(1)=1.
遞迴程式設計實現
程式1#include
int f(int n)
int main()
現在來說說動態規劃的基本思想
動態規劃的關鍵是發現子問題和怎麼記錄子問題,以上面的例子說明
(1)對子問題可遞迴的求解,當n>1時,f(n)=f(n-1)+f(n-2);否則,f(1)=f(0)=1;
(2)這些子問題是有重疊的,即求解某個問題時,某些子問題可能需要求解多次。例如求解f(5)時,f(2)就被求解了3次。
在上面兩個條件下,用動態規劃的方式來求解會高效很多。就是把子問題記錄下來,每個子問題只求解一次,從而提高了效率。
程式2#include
int result[100];
int f(int n)
int main()
程式3#include
int f[100];
int main()
程式3是否讓你想起了那個兔子繁殖的問題呢?
小結一下
動態規劃,採用分治的策略,把求最優解問題分解為求若干子問題的最優解,記錄子問題的解,化繁為簡,很實用,也很高效。
動態規劃 計畫乙個公司聚會
問題 stewart教授是一家公司總裁的顧問,這家公司計畫乙個公司聚會。這個公司有乙個層次結構 也就是,管理關係形成一棵以總裁為根的樹。人事部給每個雇員以喜歡聚會的程度來排名,這是乙個實數。為了使每個參加者都喜歡這個聚會,總裁不希望乙個雇員和他 她 的直接上司同時參加。stewart教授面對一顆描述...
動態規劃(一) 找零問題
有陣列penny,penny中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定乙個整數aim 小於等於1000 代表要找的錢數,求換錢有多少種方法。給定陣列penny及它的大小 小於等於50 同時給定乙個整數aim,請返回有多少種方法可以湊成aim。測試樣例 ...
動態規劃(一) 0 1揹包問題
1 題目描述 對於一組不同重量 不可分割的物品,我們需要選擇一些裝入揹包,在滿足揹包最大重量限制的前提下,揹包中物品總重量的最大值是多少呢?2 輸入 第一行是物品的個數n 1 n 100000 揹包容量w 1 w 1000000 第二行是n個物品的重量。3 輸出 輸出最大值 4 樣例輸入5 9 2 ...