遞迴問題整理
深搜的
放蘋果 (poj1664):(其實就是整數劃分問題)
把m個同樣的蘋果放在n個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法? 5,1,1和1,5,1 是同一種分法。(1<=m,n<=10)
如輸入m = 7, n = 3,應輸出8 (7 0 0 )(6 1 0 )(5 2 0 )(5 1 1 )(4 3 0 )(4 2 1 )(3 3 1 )(3 2 2)
參考
/*廣義水仙花數如果乙個n位數所有數碼的n次方的和加起來等於這個數字本身,我們把這樣的數叫做廣義水仙花數,容易看出來水仙花數是n = 3的廣義水仙花數現在,我們的任務是,輸入乙個m (m解題分析:
設f(m,n) 為m個蘋果,n個盤子的放法數目,則先對n作討論,
當n>m:必定有n-m個盤子永遠空著,去掉它們對擺放蘋果方法數目不產生影響。即if(n>m) f(m,n) = f(m,m)
當n<=m:不同的放法可以分成兩類:
1、有至少乙個盤子空著,即相當於f(m,n) = f(m,n-1);
2、所有盤子都有蘋果,相當於先每個盤子放乙個蘋果,一共是n個,然後的m-n的蘋果再分配到m的盤子,即f(m,n) = f(m-n,n).
而總的放蘋果的放法數目等於兩者的和,即 f(m,n) =f(m,n-1)+f(m-n,n)
遞迴出口條件說明:
當n=1時,所有蘋果都必須放在乙個盤子裡,所以返回1;
當沒有蘋果可放時,定義為1種放法;
遞迴的兩條路,第一條n會逐漸減少,終會到達出口n==1;
第二條m會逐漸減少,因為n>m時,我們會return f(m,m) 所以終會到達出口m==0.
*/#include
int fun(int m,int n) //
m個蘋果放在n個盤子中共有幾種方法
intmain()
}
3 (153 370 371 407)
5 (54748 92727 93084)
方法:資料規模很小,可以直接列舉所有情況,然後判斷是否滿足條件。
難點:迴圈層數不確定
於是我們現在的問題是,怎麼實現這個m重迴圈?
答案是:遞迴。
#include #include全排列問題從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m=n時所有的排列情況叫全排列。using
namespace
std;
intm;
int pow(int x, int
n)//
引數說明
//deep是深度 從1-m curnum是當前的數 curnum是當前的數計算的結果,就是各位方次之後的和
void dfs(int deep, int curnum, int
cursum)
else
if (deep <=m)
}int
main()
return0;
}
這也有資源
#include #include框架void pailie(char *str, int m, int
n)
int length =strlen(str);
for (int i=0;ii)
}}void
main()
深度優先搜尋解決問題的框架廣度優先搜尋void dfs(int
deep, state curstate)
}else}}
三個水杯
答案:
}樹的層序遍歷其實也是一種廣度優先搜尋吧 **不寫了
深度優先搜尋和廣度優先搜尋
深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...
廣度優先搜尋和深度優先搜尋
dbf深度優先搜尋,最經典的方法,可以使用遞迴來實現。結構體定義 typedef char vertextype typedef int edgetype define maxvex 100 define infinite 65535 typedef struct mgraph 測試函式如下 mgr...
深度優先搜尋和廣度優先搜尋
定義 圖 graph 是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為 g v,e 其中,g表示乙個圖,v是圖g中頂點的集合,e是圖g中邊的集合.簡單點的說 圖由節點和邊組成。乙個節點可能與眾多節點直接相連,這些節點被稱為鄰居。如二叉樹就為乙個簡單的圖 廣度優先搜尋演算法 breadth f...